为什么需要线程池? 每次都要new一个thread,开销大,性能差;不能统一管理;功能少(没有定时执行、中断等)。 使用线程池的好处是,可重用,可管理。
Executor
4种线程池 // 可缓存线程池,如果缓存中没有可用的,则移出60秒未使用过的线程 ExecutorService service= Executors.new
CachedThreadPool();
// 大小固定的线程池 ExecutorService service= Executors.new
FixedThreadPool(5); // 单线程,是线程量=1的FixedThreadPool,多任务下相当于排队。 ExecutorService service= Executors.new
SingleThreadPool(); // 支持定时和周期,一般情况下可替代timer ScheduledExecutorService exec = Executors.new
ScheduledThreadPool(int corePoolSize)
Demo ExecutorService pool= Executors.new
CachedThredPool(); pool.ececute(new Runable()); // 关闭,不再接受新的任务请求 pool.shutdown(); // 立即关闭,停止接受task, pool.showdownNow();
Future .submit(Runnable) 返回一个Future,主要目的是检查任务执行的状况(是否完成,有无异常)。 interface Future<V> { V get() throws …; V get(long timeout,TimeUnit unit) throws ..; void cancel(boolean mayInterrupt); // 取消任务,如果已经开始,mayInterrupt=true时被中断 boolean isCancelled(); boolean isDown(); } Future task = pool.submit(new Runnable()); task.isDone(); // task.get(); // 阻塞当前线程,如果task在执行过程中有异常,则会在这里重新抛出
Callable Runnable没有返回值,Callable<E>有返回值; submit一个runnable,不能知道运行结果,可以submit一个callable。 // 创建callable class MyCallable implements Callable<Integer> { @Override public Integer call() { return 1; } } Future<Integer> task = pool.submit(new MyCallable()); task.get(); // 阻塞,显示结果
FutureTask 同时包装了Future和Task。 Callable<Integer> c = …; FutureTask<Integer> t = new FutureTask<Integer>(c); new Thread(task).start(); Integer r = t.get();
CompletionService completionService = new ExecutorCompletionService<Long>(exec); for(){ completionService.submit(new Callable()); } // 取完成的任务,如果没有,就阻塞等待 completionService.take().get()
Java线程池 / Executor / Callable / Future
原文作者:cacard
原文地址: https://www.cnblogs.com/caca/p/java_executors.html
本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
原文地址: https://www.cnblogs.com/caca/p/java_executors.html
本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。