4月10日java多线程3
Posted sucker
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了4月10日java多线程3相关的知识,希望对你有一定的参考价值。
在之前我学习了java中的Thread 来实现多线程,今日我学习了ThreadGroup、Executor框架、ForkJoin框架。Executor 和ForkJoin都可以直接定义线程池,可以根据自己的需要自动增加线程多少,也可以自己设置固定的多少线程。
ForkJoin框架我大概认为的意思就是将一个大的任务,用二分法一直分解到一个个的特别小的任务再去执行线程进行计算,然后再将结果一起整合起来。
最近学的东西都比较难(主要是单词难记)还要更加的花心思去学,还要经常复习,不然总是会忘的。
//以下是Executor的线程池创建方式
ThreadPoolExecutor pool = Executor.newCachedThreadPool();//这是自动增加减少线程的定义方式
ThreadPoolExecutor pool = Executor.newCachedThreadPool(5);//这是自已定义固定线程的定义方式
//以下是ForkJoin的线程池创建方式
ForkJoinPool pool = new ForkJoinPool();//这是自动增加减少线程的定义方式
ForkJoinPool pool = new ForkJoinPool();//这是自已定义固定线程的定义方式
就我个人而言 比较习惯ForkJoin的线程池创建方式
附今日敲打的代码:
1 import java.util.concurrent.RecursiveTask; 2 3 public class SumTask extends RecursiveTask<Long>{ 4 private int start; 5 private int end; 6 public SumTask(int start , int end ) 7 { 8 this.start = start ; 9 this.end = end; 10 } 11 //定义一个线程执行的大小 12 public static final int Threadhold = 5; 13 @Override 14 protected Long compute() 15 { 16 Long sum = 0L; 17 boolean canComputer = (end - start) <=Threadhold ; 18 //如果计算量小于等于5的话就直接进行求和 19 if(canComputer) 20 { 21 for(int i = start; i<=end; i++) 22 { 23 sum = sum + i ; 24 } 25 } 26 //如果不满足就将该任务分解成两个任务 27 else 28 { 29 int middle = (start + end )/2 ; 30 SumTask subtask1 = new SumTask(start , middle); 31 SumTask subtask2 = new SumTask(middle+1 , end); 32 invokeAll(subtask1 , subtask2); 33 //join方法会等待线程结束,如果没有结束会形成阻塞 34 Long sum1 = subtask1.join(); 35 Long sum2 = subtask2.join(); 36 sum = sum1 + sum2 ; 37 } 38 return sum; 39 } 40 }
1 import java.util.concurrent.*; 2 3 public class SumTest { 4 5 public static void main(String[] args) throws Exception { 6 //创建线程池 7 ForkJoinPool pool = new ForkJoinPool(5); 8 //创建任务 9 SumTask task = new SumTask(1 , 10000000); 10 //提交任务 11 ForkJoinTask<Long> result = pool.submit(task); 12 do { 13 System.out.println("此时有"+pool.getActiveThreadCount()+"个线程"); 14 try { 15 Thread.sleep(50); 16 }catch(Exception e) 17 { 18 19 } 20 }while(!task.isDone()); 21 System.out.println(result.get().toString()); 22 } 23 24 }
以上是关于4月10日java多线程3的主要内容,如果未能解决你的问题,请参考以下文章