在实际应用中经常需要使用到多线程,所以jdk自带封装了线程框架ExecutorService。在多线程的世界里启一个线程简直就是很简单很容易的事情,但是由于对线程超时没有很好的控制机制,就会导致线程大批量挂死的情况。那么,问题来了,怎么设置线程超时呢?直接上代码。
1、首先来个线程池封装类
public final class PlatThreadPool {
private static final Logger log = LoggerFactory.getLogger(PlatThreadPool.class);
private static final int threadTimeout = 2;
private static final ExecutorService exc = Executors.newFixedThreadPool(15);
private static final ExecutorService cleaner = Executors.newFixedThreadPool(15);
private static BlockingQueue<Future<?>> futures = new LinkedBlockingDeque<>();
public static void submit(Runnable task){
try {
futures.put(exc.submit(task));
} catch (Exception e) {
log.error(ExceptionUtils.getException(e));
}
}
static{
new Thread(new Runnable() {
public void run() {
while(true){
try {
final Future<?> f = futures.take();
cleaner.execute(new Runnable() {
@Override
public void run() {
try {
f.get(threadTimeout, TimeUnit.SECONDS);
} catch (Exception e) {
f.cancel(true);
}
}
});
} catch (Exception e) {
log.error(ExceptionUtils.getException(e));
}
}
}
},"PLAT_THREAD_POOL_TIME_OUT_GUARD").start();
}
}
2、再来个测试类
public class ThreadPoolTest {
private static final Logger log = LoggerFactory.getLogger(ThreadPoolTest.class);
public static void main(String ...args){
for(int i=0;i<10000;i++){
final String name = "Thread_"+i;
PlatThreadPool.submit(new Runnable() {
@Override
public void run() {
long time = System.currentTimeMillis();
try {
System.out.println(name+" start.");
Thread.sleep(60000);
} catch (Exception e) {
log.error(ExceptionUtils.getException(e));
}finally{
System.out.println(name+" finished. "+(System.currentTimeMillis()-time));
}
}
});
}
}
}
好啦,干货上完啦,自己看吧,看不懂请留言。