线程池使用案例
作者:互联网
分析
定义核心线程corethread数为5,最大总线程数maxthreadsize不能超过10,在案例代码中我们用for循环创建了15个项目,前五个项目(编号0-4)顺利地作为核心线程运行,当第六个线程被execute时会被放入workqueue等待队列(这个不计入最大总线程数中),编号5-9的都放入这个队列,当第11个线程进来的时候,因为等待队列已满,所以会直接放入线程池中。(个人感觉这样似乎没有做到先来先服务,可能是哪里没理解透彻)
运行结果
正在执行task0-4,正在执行task 10-14,最后 5-9
代码
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
public class Test {
public static void main(String[] args) {
ThreadPoolExecutor executor = new ThreadPoolExecutor(5, 10, 200, TimeUnit.MILLISECONDS,
new ArrayBlockingQueue<Runnable>(5));
for(int i=0;i<15;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+"执行完毕");
}
标签:taskNum,队列,使用,案例,线程,executor,MyTask,public 来源: https://blog.csdn.net/qw160/article/details/120605412