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