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;
}
@Override
public 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;
}
@Override
protected 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;
}
@Override
protected 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();
}
;
}
版权声明:本文为weixin_41843757原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。