使用线程池创建线程
Posted wanjun-top
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用线程池创建线程相关的知识,希望对你有一定的参考价值。
例子:
package com.example.demo.thread; import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; public class ThreadPoolExecutorTest { public static void main(String[] args) { ThreadPoolExecutor executor = new ThreadPoolExecutor(5, 10, 200, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(5)); for (int i = 1; i < 16; i++) { MyTask myTask = new MyTask(i); executor.execute(myTask); System.out.println("线程池中线程数目:" + executor.getPoolSize() + ",队列中等待执行的任务数目:" + executor.getQueue().size() + ",已执行完别的任务数目:" + executor.getCompletedTaskCount()); } executor.shutdown(); } } class MyTask implements Runnable { private int taskNum; public MyTask(int num) { this.taskNum = num; } @Override public void run() { System.out.println("正在执行task " + taskNum); try { Thread.currentThread().sleep(4000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("task " + taskNum + "执行完毕"); } }
执行结果:
正在执行task 1
线程池中线程数目:1,队列中等待执行的任务数目:0,已执行完别的任务数目:0 线程池中线程数目:2,队列中等待执行的任务数目:0,已执行完别的任务数目:0 正在执行task 2 线程池中线程数目:3,队列中等待执行的任务数目:0,已执行完别的任务数目:0 正在执行task 3 线程池中线程数目:4,队列中等待执行的任务数目:0,已执行完别的任务数目:0 正在执行task 4 正在执行task 5 线程池中线程数目:5,队列中等待执行的任务数目:0,已执行完别的任务数目:0 线程池中线程数目:5,队列中等待执行的任务数目:1,已执行完别的任务数目:0 线程池中线程数目:5,队列中等待执行的任务数目:2,已执行完别的任务数目:0 线程池中线程数目:5,队列中等待执行的任务数目:3,已执行完别的任务数目:0 线程池中线程数目:5,队列中等待执行的任务数目:4,已执行完别的任务数目:0 线程池中线程数目:5,队列中等待执行的任务数目:5,已执行完别的任务数目:0 线程池中线程数目:6,队列中等待执行的任务数目:5,已执行完别的任务数目:0 正在执行task 11 线程池中线程数目:7,队列中等待执行的任务数目:5,已执行完别的任务数目:0 正在执行task 12 线程池中线程数目:8,队列中等待执行的任务数目:5,已执行完别的任务数目:0 正在执行task 13 线程池中线程数目:9,队列中等待执行的任务数目:5,已执行完别的任务数目:0 正在执行task 14 正在执行task 15 线程池中线程数目:10,队列中等待执行的任务数目:5,已执行完别的任务数目:0 task 1执行完毕 task 2执行完毕 task 13执行完毕 正在执行task 6 task 5执行完毕 task 12执行完毕 正在执行task 8 task 11执行完毕 task 3执行完毕 正在执行task 10 task 4执行完毕 正在执行task 9 正在执行task 7 task 15执行完毕 task 14执行完毕 task 6执行完毕 task 10执行完毕 task 9执行完毕 task 7执行完毕 task 8执行完毕 Process finished with exit code 0
模拟有15个任务, 首先会使用 5个线程来执行5个任务,之后5个任务会放入到队列(队列容量为5)当中,队列放满来之后,
如果没有达到设置到最大线程数,就会继续使用线程(这里10-5=5) 5个。等线程中有执行完任务的线程,会把队列的任务取出来执行
以上是关于使用线程池创建线程的主要内容,如果未能解决你的问题,请参考以下文章