常见的6种线程池及简单使用
jdk8线程池一共有6种,分别是
CachedThreadPool(cached线程池,当有任务进来的时候如果有空闲的线程则直接利用,如果无空闲线程,则新创建一个线程出来使用),
ScheduleThreadPool(schedule线程池,定时线程池,指定一个线程什么时候开始执行),
SingleThreadPool(single单例线程池,保只有一个线程,保证数据先后执行的顺序一致),
ForkJoinThreadPool(forkjoin分割,合并线程池,当进行大量的数据统计运算时,将大量的数据分割成许许多多的小任务,最后汇总任务的处理结果,提高效率),
fixedThreadPool(fixed固定数量的线程池,创建固定数量的线程,任务进来时候哪个有空哪个窒息ing),
WorkStealingThreadPool(workstealing,每个线程都监听自己的队列,当自己的队列中任务执行均完成后拉取其他队列的任务进行执行)
import java.util.concurrent.Executor;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
/*** 线程池学习 executorservice* fixed线程池* @author liuhao**/
public class ThreadPoolExecteServiceLearn {
public static void main(String[] args) throws InterruptedException {ExecutorService executorService = Executors.newFixedThreadPool(5);//定义一个线程池for(int i = 0 ; i < 6; i ++) {executorService.execute(()->{try {TimeUnit.MILLISECONDS.sleep(500);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(Thread.currentThread().getName());});//俩种放入方式,第一种只能放runnable,第二种可以让runnable和collable(又返回值)executorService.submit(()->{});}executorService.shutdown();System.out.println(executorService);//线程池详细属性System.out.println(executorService.isTerminated());//所有任务是否均执行System.out.println(executorService.isShutdown());//是否停止线程池TimeUnit.SECONDS.sleep(5);System.out.println(executorService.isTerminated());System.out.println(executorService.isShutdown());//停止线程池System.out.println(executorService);//线程池详细属性
}
}
package learn.thread0304;import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;/*** cach线程池* @author liuhao**/
public class ThreadPoolCachLearn {
public static void main(String[] args) throws InterruptedException {ExecutorService executorService = Executors.newCachedThreadPool();//缓存线程池,有仍无进来,new,有空的System.out.println(executorService);for(int i = 0; i < 5 ; i++ ) {executorService.execute(()->{try {TimeUnit.SECONDS.sleep(3);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(Thread.currentThread().getName());});}System.out.println(executorService);TimeUnit.SECONDS.sleep(10);System.out.println(executorService);for(int i = 0;i<3;i++) {executorService.execute(()->{try {TimeUnit.SECONDS.sleep(3);} catch (InterruptedException e) {e.printStackTrace();}});}TimeUnit.SECONDS.sleep(1);System.out.println(executorService.isTerminated());System.out.println(executorService);executorService.shutdown();
}
}
package learn.thread0304;import java.util.Random;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;/*** 定时线程池* @author liuhao**/
public class ThreadPoolScheduleLearn {
public static void main(String[] args) {ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(4);/*scheduledExecutorService.scheduleAtFixedRate(()->{try {TimeUnit.SECONDS.sleep(new Random().nextInt(10));} catch (InterruptedException e) {e.printStackTrace();}//定时执行的方法System.out.println("线程名"+Thread.currentThread().getName());}, 0, 500, TimeUnit.MILLISECONDS);//指定规则执行*/scheduledExecutorService.scheduleWithFixedDelay(()->{try {TimeUnit.MICROSECONDS.sleep(1000);System.out.println("///"+Thread.currentThread().getName());} catch (InterruptedException e) {e.printStackTrace();}}, 0, 1, TimeUnit.SECONDS);//前一个线程结束多久之后执行}
}
package learn.thread0304;import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;/*** 单例模式执行 ,保证任务顺序执行* @author liuhao**/
public class ThreadPoolSingleLearn {
public static void main(String[] args) {ExecutorService executorService = Executors.newSingleThreadExecutor();for(int i =0;i<5 ;i++) {final int j = i ;executorService.execute(()->{System.out.println(j+"///"+Thread.currentThread().getName());});}
}
}
package learn.thread0304;import java.io.IOException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;/*** workstealingpool//工作窃取线程池* * 每个线程监听自己的队列,当当前队列任务执行均结束,则去别的队列拉取任务执行* * @author liuhao**/
public class ThreadPoolWorkStealingPool {public static void main(String[] args) throws IOException, InterruptedException {ExecutorService executorService = Executors.newWorkStealingPool(3);System.out.println(Runtime.getRuntime().availableProcessors());executorService.execute(new AddTask(100));// 精灵线程,后台线程,daemon,主线程不阻塞看不到输出executorService.execute(new AddTask(200));executorService.execute(new AddTask(300));executorService.execute(new AddTask(400));executorService.execute(new AddTask(500));executorService.execute(new AddTask(600));System.out.println(executorService);TimeUnit.MICROSECONDS.sleep(6000);System.out.println(executorService);System.in.read();}static class AddTask implements Runnable {long time;public AddTask(long time) {super();this.time = time;}@Overridepublic void run() {try {TimeUnit.MICROSECONDS.sleep(time);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(time+"///123" + Thread.currentThread().getName());}}
}
package learn.thread0304;import java.io.IOException;
import java.util.Arrays;
import java.util.Random;
import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.RecursiveTask;/*** forkjoin 将一个项目分成多个子项目,提高效率* 使用过时需要注意,RecursiveAction接口无返回值,RecursiveTask有返回值,使用join求和** @author liuhao*/
public class ForkJoinPoolLearn {static Random random = new Random();static final int MAX_VAL = 50000;static int[] nums = new int[1000000];/*** 线程运行求取数组的和*///方法一,数组便利求和static {for (int i = 0; i < nums.length; i++) {nums[i] = random.nextInt(100);}System.out.println("数组值为" + Arrays.stream(nums).sum());}//方法二forkjoin
/* static class AddTask extends RecursiveAction{private static final long serialVersionUID = 1L;int start ,end;public AddTask(int start, int end) {super();this.start = start;this.end = end;}@Overrideprotected void compute() {if(end-start < MAX_VAL) {long sum = 0l;for(int i = start ; i < end; i ++) {sum = sum + nums[i];}System.out.println(sum);}else {int middle = start + (end - start)/2;AddTask AddTask01 = new AddTask(start,middle);AddTask AddTask02 = new AddTask(middle,end);AddTask01.fork();AddTask02.fork();}}}*///方法三,RecursiveTask,又返回值static class AddTask extends RecursiveTask<Long> {private static final long serialVersionUID = 1L;int start, end;public AddTask(int start, int end) {super();this.start = start;this.end = end;}@Overrideprotected Long compute() {if (end - start < MAX_VAL) {long sum = 0l;for (int i = start; i < end; i++) {sum = sum + nums[i];}//System.out.println(sum);return sum;} else {int middle = start + (end - start) / 2;AddTask AddTask01 = new AddTask(start, middle);AddTask AddTask02 = new AddTask(middle, end);AddTask01.fork();AddTask02.fork();return AddTask01.join() + AddTask02.join();}}}public static void main(String[] args) throws IOException {ForkJoinPool forkJoinPool = new ForkJoinPool();AddTask task = new AddTask(0, nums.length);forkJoinPool.execute(task);long result = task.join();System.out.println(result);System.in.read();};
}
常见的6种线程池及简单使用相关推荐
- Java常见的5种线程池
在开发过程中我们常常需要使用到多线程来提高我们代码处理某些任务的效率,最基本的两种创建多线程的方式分别是继承Thread类和实现Runnable接口.但是创建线程和销毁线程的系统开销比较大,而且过多的 ...
- Android中常见的4种线程池的理解(转)
转:https://blog.csdn.net/l540675759/article/details/62230562 转:https://blog.csdn.net/seu_calvin/artic ...
- Android开发——Android中常见的4种线程池(保证你能看懂并理解)
0.前言 转载请注明出处:http://blog.csdn.net/seu_calvin/article/details/52415337 使用线程池可以给我们带来很多好处,首先通过线程池中线程的重用 ...
- Java多线程系列(五):线程池的实现原理、优点与风险、以及四种线程池实现
为什么需要线程池 我们有两种常见的创建线程的方法,一种是继承Thread类,一种是实现Runnable的接口,Thread类其实也是实现了Runnable接口.但是我们创建这两种线程在运行结束后都会被 ...
- java线程池详解及五种线程池方法详解
基础知识 Executors创建线程池 Java中创建线程池很简单,只需要调用Executors中相应的便捷方法即可,比如Executors.newFixedThreadPool(int nThrea ...
- java常用的几种线程池
1. 为什么使用线程池 诸如 Web 服务器.数据库服务器.文件服务器或邮件服务器之类的许多服务器应用程序都面向处理来自某些远程来源的大量短小的任务.请求以某种方式到达服务器,这种方式可能是通过网络协 ...
- Android AsyncTask两种线程池分析和总结
转自:http://bbs.51cto.com/thread-1114378-1-1.html Android AsyncTask两种线程池分析和总结 (一) 前言 在android Async ...
- [转]new Thread的弊端及Java四种线程池的使用
介绍new Thread的弊端及Java四种线程池的使用,对Android同样适用.本文是基础篇,后面会分享下线程池一些高级功能. 1.new Thread的弊端 执行一个异步任务你还只是如下new ...
- Android之AsyncTask两种线程池分析和总结
Android AsyncTask两种线程池分析和总结 (一) 前言 在android AsyncTask里面有两种线程池供我们调用 1. THREAD_POOL_EXECUTOR, 异步 ...
最新文章
- 苹果连接电脑只能充电_苹果 iPhone 12 曝充电 Bug:多口充电器无一幸免 只能用单独充电头 - 手机 - IT商业网...
- ActiveMQ学习笔记(二) JMS与Spring
- ABCpdf.NET 的简易使用指南
- 焊接产生的问题和解决方法
- 软件工程个人作业05
- 正确使用stl map的erase方法
- python3 beautifulsoup 表格,使用Python中的BeautifulSoup拉取特定的表数据
- CF1019D-Large Triangle【计算几何,二分】
- html检测用户在线离线,HTML5 --- navigator.onLine 离线检测(示例代码)
- 03-树2. List Leaves (25) 二叉树的层序遍历
- 还在使用集合类完成这些功能?不妨来看看 Guava 集合类!!!
- 【目标跟踪】基于matlab Kalman滤波目标跟踪【含Matlab源码 388期】
- cad的计算机功能,CAD的基本功能有哪些
- ios隐私政策_新的iOS 14已经揭露了严重的隐私问题
- WebWall-02.Burt Force(暴力破解漏洞)
- 李玉刚与石头的雨花石
- Java-JavaWeb—(4)MySQL数据库
- Praat脚本-006 | 批量修改删除复制某一层
- 新手学开车,起步,停车,倒库移库,练习图解,开车基本技巧
- 数据库DDL与DML指的什么?
热门文章
- 虚拟机VMware搭建代码环境
- CoreJavaE10V1P3.2 第3章 Java的基本编程结构-3.2 注释
- MySQL学习——标识符语法和命名规则
- 一个简单的Ajax实例
- 进程和线程相关小知识
- Cookies和Session(三)--SessionState
- JAVA学生信息管理系统IO流版
- jQuery(一)—— jQuery 概述 / jQuery 选择器 / jQuery 样式操作 / jQuery 效果
- error C4996: 'fopen': This function or variable may be unsafe. Consider using fopen_s instead.
- Array deduplication