今天需要用到多线程的时候,用到了线程池,以及Future class,测试代码如下:
ExecutorService pool = Executors.newFixedThreadPool(2);
List<Future<String>> list = new ArrayList<Future<String>>();
for(int i = 0; i < 10; i++) {
MyFuture future = new MyFuture();
list.add(pool.submit(future));
System.out.println("each times : " + i);
}
for(int i = 0; i < list.size(); i++) {
System.out.println("future list times : " + list.get(i).get())
}
System.out.println("main thread finish!");
pool.shutdown();
当线程池里面的线程没有进来的任务多的时候,这个时候主线程和线程池分别处于什么状态?
如果没有主线程没有future.get()方法的时候,主线程会继续执行下面的代码。
线程池没有空闲线程的时候,会把进来的任务放到线程池的等待队列。直到有空闲线程才继续执行。
如果主线程调用了future.get()方法的时候,主线程会等待所有任务执行完毕后,才继续执行后面的代码。如果任务队列被block了,主线程也会无限期的等待下去。可以通过给get()设置过期时间来避免这个问题。