public static void main(String[] args) {
ExecutorService service= Executors.newFixedThreadPool(1);
System.out.println(System.currentTimeMillis());
for (int i = 0; i < 10; i++) {
Runnable runnable=new Runnable() {
@Override
public void run() {
long time=3000;
try {
Thread.sleep(time);
System.out.println(Thread.currentThread().getName()+"休眠了 "+time+" ms");
} catch (Exception e) {
e.printStackTrace();
}
}
};
service.execute(runnable);
}
service.shutdown();
System.out.println(System.currentTimeMillis());
System.out.println("Now,main is just over");
}
多看看API文档,Executors.newFixedThreadPool(1);这种创建的线程池,虽然池里只有一个线程,但是它有一个无界队列,提交执行的线程数大于线程池的线程数时,就会进入这个无界队列等待执行,当线程池中有空闲线程时,就从队列里取出等待执行的线程任务执行。无界队列是没有大小限制的,你放再多的线程进去,都不会报错,直到整个java程序内存溢出。
ExecutorService service= Executors.newFixedThreadPool(1);
查看一下源码:
public static ExecutorService newFixedThreadPool(int nThreads) {
return new ThreadPoolExecutor(nThreads, nThreads,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>());
}
看到 new LinkedBlockingQueue() 这个参数了吗?
你提交的任务,都会被缓存到这个队列中,而这个队列还没有设置上限,
所以,你提交任务的时候不会卡主线程,因为没有来得及执行的任务都在缓存队列里面等待执行呢。
service.shutdown() 并不会阻塞主线程。这个函数的作用是:当线程池里的任务都执行完后关闭线程池。
如果你不调用这个方法,你会发现 当使线程池里的任务都执行完,程序也不会关闭。这是由于线程池的工作模式导致的。
它不阻塞主线程,但是你主线程跑完了也不会结束