iteye_19622 2009-02-14 11:20
浏览 244
已采纳

线程池怎么做到线程重用?

我很早就知道线程池这个概念,但是一直没有机会使用到,我对线程池的一个比较深刻的认识就是线程池中的线程是个数限制的,一次性构造全部但是是可以重用的,不需要每次都去构造一个新的。但是最近我做项目的做到了相关的技术,发现好像并不是这么一回事。。。

 

 

public class MyThread implements Runnable{

    public MyThread() {
        System.out.println("construct...");
    }

    
    public static void main(String[] args) {
        ExecutorService service = Executors.newFixedThreadPool(2);
        for(int i = 0; i < 10; i++){
            service.submit(new MyThread());
        }
    }

    public void run() {
        try{
            System.out.println("run...");
            Thread.sleep((long) (Math.random()*1000));
        }catch(Exception e){
            
        }
    }
}

这是我写的一个很简单的测试类,运行后发现构造函数被调用了10次(我觉的如果能重用的话调用两次就够了吧),那我就纳闷了,线程池中的线程真的可以做到重用吗?还是我的写法有问题?还是我的认识从根本上就是错误的?


问题补充:
先感谢aninfeel和lewhwa的热心帮助,现在我比较关心的是使用Executors创建的线程池如何做到线程重用?是不能用new(如:service.submit(new MyThread());)来创建线程吗?
问题补充:
   我可以这样理解吗:service.submit(new MyThread())执行的时候实际上是调用Executors.newFixedThreadPool(2)这步中创建的两个线程,并且这两个线程是可以重用的,然后通过这两个可重用的线程去调用MyThread,从而达到线程重用的目的吗?
  • 写回答

6条回答 默认 最新

  • ocean_end 2009-02-16 14:43
    关注

    [quote]new MyThread 10次,当然构造函数10次。
    Executors.newFixedThreadPool(2); 创建了有2个线程的线程池,这两个线程可复用,并且同时只有两个线程执行,多余2个任务等待被执行。
    [/quote]
    Executors.newFixedThreadPool(2); 是创建一个有2个线程的线程池。
    service.submit(new MyThread()); 是向线程池中添加需要执行的任务,而不是向线程池添加线程

    [quote]
    问题补充:
    先感谢aninfeel和lewhwa的热心帮助,现在我比较关心的是使用Executors创建的线程池如何做到线程重用?是不能用new(如:service.submit(new MyThread());)来创建线程吗?

    [/quote]
    Executors.newFixedThreadPool(2); 创建的2个线程是被重用的。
    service.submit(new MyThread()); 向线程池中添加的任务,线程池是不会负责的。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(5条)

报告相同问题?

悬赏问题

  • ¥30 关于用python写支付宝扫码付异步通知收不到的问题
  • ¥50 vue组件中无法正确接收并处理axios请求
  • ¥15 隐藏系统界面pdf的打印、下载按钮
  • ¥15 MATLAB联合adams仿真卡死如何解决(代码模型无问题)
  • ¥15 基于pso参数优化的LightGBM分类模型
  • ¥15 安装Paddleocr时报错无法解决
  • ¥15 python中transformers可以正常下载,但是没有办法使用pipeline
  • ¥50 分布式追踪trace异常问题
  • ¥15 人在外地出差,速帮一点点
  • ¥15 如何使用canvas在图片上进行如下的标注,以下代码不起作用,如何修改