java线程池实现Demo

作者: admin 分类: 多线程 发布时间: 2017-05-09 16:44
package threadPool;

/**
 * @author itmrchen
 * @date 2017/5/9
 * @time 16:27
 */
public class MyTask implements Runnable {
    private int taskNum;

    public MyTask(int num) {
        this.taskNum = num;
    }

    public void run() {
        System.out.println("正在执行task " + taskNum);
        try {
            Thread.currentThread().sleep(4000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("task " + taskNum + "执行完毕");
    }
}

package threadPool;

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

/**
 * @author itmrchen
 * @date 2017/5/9
 * @time 16:28
 */
public class Test {
    public static void main(String[] args) {
        /**
         * 5、核心池大小
         * 10、最大允许的池大小
         * 200 线程没有任务执行时保留多长时间
         * MILLISECONDS、时间单位、毫秒
         * 最后一个阻塞队列,存储等待执行的任务
         */
        ThreadPoolExecutor executor = new ThreadPoolExecutor(5, 10, 200, TimeUnit.MILLISECONDS,
                new ArrayBlockingQueue<Runnable>(15));

        for(int i=0;i<21;i++){
            MyTask myTask = new MyTask(i);
            executor.execute(myTask);
            System.out.println("线程池中线程数目:"+executor.getPoolSize()+",队列中等待执行的任务数目:"+
                    executor.getQueue().size()+",已执行完成的任务数目:"+executor.getCompletedTaskCount());
        }
        executor.shutdown();
    }
}

运行结果:
正在执行task 0
线程池中线程数目:1,队列中等待执行的任务数目:0,已执行完成的任务数目:0
线程池中线程数目:2,队列中等待执行的任务数目:0,已执行完成的任务数目:0
正在执行task 1
线程池中线程数目:3,队列中等待执行的任务数目:0,已执行完成的任务数目:0
正在执行task 2
线程池中线程数目:4,队列中等待执行的任务数目:0,已执行完成的任务数目:0
正在执行task 3
线程池中线程数目:5,队列中等待执行的任务数目:0,已执行完成的任务数目:0
正在执行task 4
线程池中线程数目:5,队列中等待执行的任务数目:1,已执行完成的任务数目:0
线程池中线程数目:5,队列中等待执行的任务数目:2,已执行完成的任务数目:0
线程池中线程数目:5,队列中等待执行的任务数目:3,已执行完成的任务数目:0
线程池中线程数目:5,队列中等待执行的任务数目:4,已执行完成的任务数目:0
线程池中线程数目:5,队列中等待执行的任务数目:5,已执行完成的任务数目:0
线程池中线程数目:5,队列中等待执行的任务数目:6,已执行完成的任务数目:0
线程池中线程数目:5,队列中等待执行的任务数目:7,已执行完成的任务数目:0
线程池中线程数目:5,队列中等待执行的任务数目:8,已执行完成的任务数目:0
线程池中线程数目:5,队列中等待执行的任务数目:9,已执行完成的任务数目:0
线程池中线程数目:5,队列中等待执行的任务数目:10,已执行完成的任务数目:0
线程池中线程数目:5,队列中等待执行的任务数目:11,已执行完成的任务数目:0
线程池中线程数目:5,队列中等待执行的任务数目:12,已执行完成的任务数目:0
线程池中线程数目:5,队列中等待执行的任务数目:13,已执行完成的任务数目:0
线程池中线程数目:5,队列中等待执行的任务数目:14,已执行完成的任务数目:0
线程池中线程数目:5,队列中等待执行的任务数目:15,已执行完成的任务数目:0
线程池中线程数目:6,队列中等待执行的任务数目:15,已执行完成的任务数目:0
正在执行task 20
task 2执行完毕
task 0执行完毕
task 1执行完毕
正在执行task 5
正在执行task 7
正在执行task 6
task 3执行完毕
task 4执行完毕
正在执行task 8
正在执行task 9
task 20执行完毕
正在执行task 10
task 5执行完毕
task 7执行完毕
task 6执行完毕
正在执行task 12
正在执行task 11
正在执行task 13
task 8执行完毕
task 9执行完毕
正在执行task 14
正在执行task 15
task 10执行完毕
正在执行task 16
task 12执行完毕
task 13执行完毕
task 11执行完毕
正在执行task 18
正在执行task 17
正在执行task 19
task 14执行完毕
task 15执行完毕
task 16执行完毕
task 18执行完毕
task 19执行完毕
task 17执行完毕

一般需要根据任务的类型来配置线程池大小:

如果是CPU密集型任务,就需要尽量压榨CPU,参考值可以设为 NCPU+1

如果是IO密集型任务,参考值可以设置为2*NCPU

当然,这只是一个参考值,具体的设置还需要根据实际情况进行调整,比如可以先将线程池大小设置为参考值,再观察任务运行情况和系统负载、资源利用率来进行适当调整。

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!

发表评论

电子邮件地址不会被公开。 必填项已用*标注