【并发编程】- Executors 创建线程池

185 阅读4分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第5天,点击查看活动详情

探究newCacheThreadPool()创建为线程池

实现代码如下:

public class TheRunnable implements Runnable {

    private String username;

    public TheRunnable(String username){
        super();
        this.username=username;
    }


    @Override
    public void run() {
        try {
            System.out.println(Thread.currentThread().getName() +" username= "+username+"  开始时间:"+System.currentTimeMillis());
            Thread.sleep(2000);
            System.out.println(Thread.currentThread().getName() +" username= "+username+"  结束时间:"+System.currentTimeMillis());
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

运行类代码如下:

public class RunnableRun {
    public static void main(String[] args) {
        ExecutorService executorService = Executors.newCachedThreadPool();
        for (int i = 0; i < 10 ; i++) {
            executorService.execute(new TheRunnable(String.valueOf(i+1)));
        }
    }
}

运行结果如下:

pool-1-thread-1 username= 1  开始时间:1653877877299
pool-1-thread-2 username= 2  开始时间:1653877877299
pool-1-thread-3 username= 3  开始时间:1653877877300
pool-1-thread-4 username= 4  开始时间:1653877877300
pool-1-thread-5 username= 5  开始时间:1653877877300
pool-1-thread-6 username= 6  开始时间:1653877877301
pool-1-thread-7 username= 7  开始时间:1653877877301
pool-1-thread-8 username= 8  开始时间:1653877877301
pool-1-thread-9 username= 9  开始时间:1653877877301
pool-1-thread-10 username= 10  开始时间:1653877877301
pool-1-thread-1 username= 1  结束时间:1653877879306
pool-1-thread-2 username= 2  结束时间:1653877879306
pool-1-thread-10 username= 10  结束时间:1653877879308
pool-1-thread-9 username= 9  结束时间:1653877879308
pool-1-thread-8 username= 8  结束时间:1653877879308
pool-1-thread-7 username= 7  结束时间:1653877879308
pool-1-thread-6 username= 6  结束时间:1653877879308
pool-1-thread-3 username= 3  结束时间:1653877879308
pool-1-thread-4 username= 4  结束时间:1653877879308
pool-1-thread-5 username= 5  结束时间:1653877879308

从运行结果看出线程池对象创建时完全成功,线程池中创建了10个线程,但是还没达到线程池中线程对象可以复用的效果。

修改运行类代码如下:

public class RunnableRun {
    public static void main(String[] args) {
        ExecutorService executorService = Executors.newCachedThreadPool();
        for (int i = 0; i < 5; i++) {
            executorService.execute(new TheRunnable(String.valueOf(i+1)));
        }
        try {
            Thread.sleep(3000);
            System.out.println("");
            for (int i = 0; i < 5 ; i++) {
                executorService.execute(new TheRunnable(String.valueOf(i+1)));
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

运行结果如下:

pool-1-thread-1 username= 1  开始时间:1653878802585
pool-1-thread-3 username= 3  开始时间:1653878802586
pool-1-thread-2 username= 2  开始时间:1653878802586
pool-1-thread-4 username= 4  开始时间:1653878802587
pool-1-thread-5 username= 5  开始时间:1653878802587
pool-1-thread-3 username= 3  结束时间:1653878804587
pool-1-thread-1 username= 1  结束时间:1653878804588
pool-1-thread-2 username= 2  结束时间:1653878804602
pool-1-thread-5 username= 5  结束时间:1653878804602
pool-1-thread-4 username= 4  结束时间:1653878804602

pool-1-thread-2 username= 1  开始时间:1653878805594
pool-1-thread-4 username= 2  开始时间:1653878805594
pool-1-thread-5 username= 3  开始时间:1653878805594
pool-1-thread-1 username= 4  开始时间:1653878805594
pool-1-thread-3 username= 5  开始时间:1653878805595
pool-1-thread-1 username= 4  结束时间:1653878807604
pool-1-thread-5 username= 3  结束时间:1653878807605
pool-1-thread-3 username= 5  结束时间:1653878807604
pool-1-thread-4 username= 2  结束时间:1653878807606
pool-1-thread-2 username= 1  结束时间:1653878807606

从运行结果看出线程池中线程对象被复用了