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的主要内容,如果未能解决你的问题,请参考以下文章

4月11日java多线程4

多线程(模拟买票)-----java基础知识总结

Java简介

回顾java多线程中sleep的使用问题

;~ 小部分AutoHotkey源代码片段测试模板2019年10月9日.ahk

java实现日期排序问题