java线程池之newCachedThreadPool
Posted 胡乐天
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java线程池之newCachedThreadPool相关的知识,希望对你有一定的参考价值。
newCachedThreadPool测试类
package com.thread.pool;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class TestCachedThreadPool {
public static void main(String[] args) {
/**
* 此方法调用(有两种,此处写无工厂的): new ThreadPoolExecutor(0, Integer.MAX_VALUE,
* 60L, TimeUnit.SECONDS,
* new SynchronousQueue<Runnable>());
*
* 可以看到,核心线程数为0,最大线程数为整数的最大值,
* 空闲线程空闲时间为60s
*
* new SynchronousQueue():这里是new了一个特殊的队列,
* 它的特别之处在于内部没有容器,当A线程将任务放入到队列时,如果当前没有对应线程池中的线程来获取该任务,则A线程进行等待
* 等待线程池新产生一个线程来获取该任务,则唤醒A线程,然后新线程获取该任务(即任务数据传递)
*
* 根据线程池的执行顺序得知,当有新任务时,由于核心线程数为0(假设此时线程池内没有线程),会将新任务放入到队列中
* 此时,立即去创建新线程,新线程接收该任务并执行,执行完毕后,继续存活,若60s内没有新任务,则该线程销毁。
*
* 此种线程池适用于负载较轻的场景,执行短期异步任务
* 这样可以使任务得到快速执行,并且因为任务时间短暂,可以很快执行完成,也不会造成cpu过度切换
*/
ExecutorService executor = Executors.newCachedThreadPool();
for(int i = 0; i<10;i++){
Thread thread = new Thread(new ThreadPool(""+i));
executor.execute(thread);
}
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
//第二次创建线程任务时,由于第一次创建的十个线程都执行完成了,那么接下来的使用的还是对应的十个线程
for(int i = 0; i<10;i++){
Thread thread = new Thread(new ThreadPool(""+i));
executor.execute(thread);
}
executor.shutdown();
}
}
线程任务类
package com.thread.pool;
import java.util.Date;
public class ThreadPool implements Runnable {
private static ThreadPool threadPool = null;
String name;
public ThreadPool(String name){
this.name = name;
}
@Override
public void run() {
doSomeThing();
}
public static synchronized Runnable getInstance(){
if(threadPool == null){
threadPool = new ThreadPool("getInstance");
}
return getInstance();
}
private void doSomeThing() {
for (int i=0;i<10;i++){
System.out.println((new Date()).toLocaleString() + " " + Thread.currentThread().getName() + "执行" +i + ",name=" + name);
}
/* try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}*/
}
}
以上是关于java线程池之newCachedThreadPool的主要内容,如果未能解决你的问题,请参考以下文章