Executors创建线程池

在jdk1.8版本加入WorkStealingPool线程后,通过Executors共可创建5种线程池

newSingleThreadExecutor是创建一个单任务线程池,串行执行所有任务。它只会用唯一的工作线程来执行任务,任务执行顺序按照先进先出(FIFO),如果这个唯一的线程因为异常结束,那么会有一个新的线程来替代它。

newCachedThreadPool是创建一个缓存线程池,只有非核心线程,最大线程数很大,每新来一个任务,当没有空余线程的时候就会重新创建一个线程,这边有一个超时机制,当空闲的线程超过60s内没有用到的话,就会被回收,它可以一定程序减少频繁创建/销毁线程,减少系统开销,适用于执行时间短并且数量多的任务场景。

newFixedThreadPool是创建指定个数的线程。在程序执行时,可以同时允许这些线程并发执行。如果在关闭前的执行期间由于失败而导致任何线程终止,那么一个新线程将代替它执行后续的任务。

newScheduledThreadPool是创建一个定长线程池,支持定时及周期性任务执行。通过过schedule方法可以设置任务的周期执行延时执行,并行的任务数量是核心线程数,其余任务根据间隔时间下次执行。

newWorkStealingPool是创建一个窃取线程池,假设共有三个线程同时执行, A, B, C。当A,B线程池有未完成的任务,而C已经处理完毕,则C线程会从A或者B中窃取任务执行,这就叫工作窃取。假如A线程中的队列里面分配了3个任务,而B线程的队列中分配了1个任务,当B线程执行完任务后,它会主动的去A线程中窃取其他的任务进行执行。

  1. /**
  2. *单任务线程池
  3. */
  4. ExecutorService pool = Executors.newSingleThreadExecutor();
  5. for (int i=0;i<10;i++){
  6. final int task=i;
  7. pool.execute(new Runnable() {
  8. @Override
  9. public void run() {
  10. System.out.println("单任务线程池"+Thread.currentThread().getName()+"==="+task);
  11. try {
  12. Thread.sleep(5*1000);
  13. } catch (InterruptedException e) {
  14. e.printStackTrace();
  15. }
  16. }
  17. });
  18. }
  19. /**
  20. *定时周期线程池
  21. */
  22. ScheduledExecutorService service= Executors.newScheduledThreadPool(5);
  23. for (int i=0;i<10;++i){
  24. final int task=i;
  25. service.schedule(new Runnable() {
  26. @Override
  27. public void run() {
  28. // System.out.println("任务执行线程1"+Thread.currentThread().getName()+"==="+task);
  29. //在5秒后执行这里5个线程在5秒后并发执行
  30. }
  31. },5, TimeUnit.SECONDS);
  32. }
  33. /**
  34. *缓存线程池
  35. */
  36. ExecutorService threadPool= Executors.newCachedThreadPool();
  37. for (int i=0;i<10;i++){
  38. final int task=i;
  39. threadPool.execute(new Runnable() {
  40. @Override
  41. public void run() {
  42. System.out.println("缓存线程池"+Thread.currentThread().getName()+"==="+task);
  43. }
  44. });
  45. }
  46. /**
  47. *固定并发线程池
  48. */
  49. ExecutorService service = Executors.newFixedThreadPool(4);
  50. for (int i=0;i<10;++i){
  51. final int task=i;
  52. service.execute(new Runnable() {
  53. @Override
  54. public void run() {
  55. System.out.println("固定并发数线程池"+Thread.currentThread().getName()+"==="+task);
  56. }
  57. });
  58. }
  59. /**
  60. *窃取线程池
  61. */
  62. ExecutorService executor = Executors.newWorkStealingPool(8);
  63. for (int i=0;i<5;i++){
  64. final int task=i;
  65. executor.execute(()->{
  66. System.out.println("qq"+task);
  67. });
  68. }

发表评论

表情:
评论列表 (有 0 条评论,96人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Java Executors(线)

    Sun在Java5中,对Java线程的类库做了大量的扩展,其中线程池就是Java5的新特征之一,除了线程池之外,还有很多多线程相关的内容,为多线程的编程带来了极大便利。为了编写

    相关 Executors工厂创建线

    newCached ThreadPool(创建一个可缓存线程池): 优点:很灵活,弹性的线程池线程管理,用多少线程给多大的线程池,不用后及时回收,用则新建 缺点:一旦线