Java并行计算线程池_java高并发编程(五)线程池

摘自马士兵java并发编程

一、认识Executor、ExecutorService、Callable、Executors

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

/*** 认识Executor*/

packageyxxy.c_026;importjava.util.concurrent.Executor;public class T01_MyExecutor implementsExecutor {public static voidmain(String[] args) {new T01_MyExecutor().execute(newRunnable(){

@Overridepublic voidrun() {

System.out.println("hello executor");

}

});

}

@Overridepublic voidexecute(Runnable command) {//new Thread(command).run();

command.run();

}

}

View Code

Executor执行器是一个接口,只有一个方法execute执行任务,在java的线程池的框架里边,这个是最顶层的接口;

ExecutorService:从Executor接口继承。

Callable:里面call方法,和Runnable接口很像,设计出来都是被其他线程调用的;但是Runnable接口里面run方法是没有返回值的也不能抛出异常;而call方法有返回值可以抛异常;

Executors: 操作Executor的一个工具类;以及操作ExecutorService,ThreadFactory,Callable等;

二、ThreadPool:

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

/*** 线程池的概念*/

packageyxxy.c_026;importjava.util.concurrent.ExecutorService;importjava.util.concurrent.Executors;importjava.util.concurrent.TimeUnit;public classT05_ThreadPool {public static void main(String[] args) throwsInterruptedException {

ExecutorService service= Executors.newFixedThreadPool(5); //execute submit

for (int i = 0; i < 6; i++) {

service.execute(()->{try{

TimeUnit.MILLISECONDS.sleep(500);

}catch(InterruptedException e) {

e.printStackTrace();

}

System.out.println(Thread.currentThread().getName());

});

}

System.out.println(service);

service.shutdown();

System.out.println(service.isTerminated());

System.out.println(service.isShutdown());

System.out.println(service);

TimeUnit.SECONDS.sleep(5);

System.out.println(service.isTerminated());

System.out.println(service.isShutdown());

System.out.println(service);

}

}

View Code

console:

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

java.util.concurrent.ThreadPoolExecutor@53d8d10a[Running, pool size = 5, active threads = 5, queued tasks = 1, completed tasks = 0]false

truejava.util.concurrent.ThreadPoolExecutor@53d8d10a[Shutting down, pool size= 5, active threads = 5, queued tasks = 1, completed tasks = 0]

pool-1-thread-1pool-1-thread-3pool-1-thread-2pool-1-thread-5pool-1-thread-4pool-1-thread-1

true

truejava.util.concurrent.ThreadPoolExecutor@53d8d10a[Terminated, pool size= 0, active threads = 0, queued tasks = 0, completed tasks = 6]

View Code

创建了一个线程池,扔了5个线程,接下来要执行6个任务,扔进去线程池里面就启一个线程帮你执行一个,因为这里最多就起5个线程,接下来扔第6个任务的时候,不好意思,它排队了,排在线程池所维护的一个任务队列里面,任务队列大多数使用的都是BlockingQueue,这是线程池的概念;

有什么好处?好处在于如果这个任务执行完了,这个线程不会消失,它执行完任务空闲下来了,如果有新的任务来的时候,直接交给这个线程来运行就行了,不需要新启动线程;从这个概念上讲,如果你的任务和线程池线程数量控制的比较好的情况下,你不需要启动新的线程就能执行很多很多的任务,效率会比较高,并发性好;

service.shutdown():关闭线程池,shutdown是正常的关闭,它会等所有的任务都执行完才会关闭掉;还有一个是shutdownNow,二话不说直接就给关了,不管线程有没有执行完;

service.isTerminated(): 代表的是这里所有执行的任务是不是都执行完了。isShutdown()为true,注意它关了但并不代表它执行完了,只是代表正在关闭的过程之中(注意打印Shutting down)

打印5个线程名字,而且第一个线程执行完了之后,第6个任务来了,第1个线程继续执行,不会有线程6;

当所有线程全部执行完毕之后,线程池的状态为Terminated,表示正常结束,complete tasks=6

线程池里面维护了很多线程,等着你往里扔任务,而扔任务的时候它可以维护着一个任务列表,还没有被执行的任务列表,同样的它还维护着另外一个队列,complete tasks,结束的任务队列,任务执行结束扔到这个队列里,所以,一个线程池维护着两个队列;

三、Future

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

/*** 认识future*/

packageyxxy.c_026;importjava.util.concurrent.ExecutionException;importjava.util.concurrent.ExecutorService;importjava.util.concurrent.Executors;importjava.util.concurrent.Future;importjava.util.concurrent.FutureTask;importjava.util.concurrent.TimeUnit;public classT06_Future {public static void main(String[] args) throwsInterruptedException, ExecutionException {/*FutureTask task = new FutureTask(new C

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值