我进行了自定义修改,
TimeoutThreadPoolExecutor并且工作正常。
public static class TimeoutThreadPoolExecutor extends ThreadPoolExecutor{ private final long timeout; private final TimeUnit timeoutUnit; private boolean isShutdown = false; private final ScheduledExecutorService timeoutExecutor = Executors.newSingleThreadScheduledExecutor(); private final ConcurrentMap<Runnable, ScheduledFuture> runningTasks = new ConcurrentHashMap<Runnable, ScheduledFuture>(); public TimeoutThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, long timeout, TimeUnit timeoutUnit) { super(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue); this.timeout = timeout; this.timeoutUnit = timeoutUnit; } public TimeoutThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory, long timeout, TimeUnit timeoutUnit) { super(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue, threadFactory); this.timeout = timeout; this.timeoutUnit = timeoutUnit; } public TimeoutThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, RejectedExecutionHandler handler, long timeout, TimeUnit timeoutUnit) { super(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue, handler); this.timeout = timeout; this.timeoutUnit = timeoutUnit; } public TimeoutThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory, RejectedExecutionHandler handler, long timeout, TimeUnit timeoutUnit) { super(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue, threadFactory, handler); this.timeout = timeout; this.timeoutUnit = timeoutUnit; } @Override public void shutdown() { isShutdown = true; super.shutdown(); } @Override public List<Runnable> shutdownNow() { timeoutExecutor.shutdownNow(); return super.shutdownNow(); } @Override protected void beforeExecute(Thread t, Runnable r) { if(timeout > 0) { final ScheduledFuture<?> scheduled = timeoutExecutor.schedule(new TimeoutTask(t), timeout, timeoutUnit); runningTasks.put(r, scheduled); } } @Override protected void afterExecute(Runnable r, Throwable t) { ScheduledFuture timeoutTask = runningTasks.remove(r); if(timeoutTask != null) { timeoutTask.cancel(false); } if (isShutdown) timeoutExecutor.shutdown(); } class TimeoutTask implements Runnable { private final Thread thread; public TimeoutTask(Thread thread) { this.thread = thread; } @Override public void run() { thread.interrupt(); System.out.println("Cancelled"); } }}情况1:无超时
final TimeoutThreadPoolExecutor executorService = new TimeoutThreadPoolExecutor( 100, 100, 0L, TimeUnit.MILLISECONDS, new linkedBlockingQueue<Runnable>(), 6, TimeUnit.SECONDS);executorService.submit(new Callable<Object>(){ @Override public Object call() throws Exception { Thread.sleep(5000); System.out.println("Done"); return null; }});executorService.shutdown();executorService.awaitTermination(1, TimeUnit.DAYS);System.out.println("Program done");它打印:
Task doneProgram done
情况2:超时
final TimeoutThreadPoolExecutor executorService = new TimeoutThreadPoolExecutor( 100, 100, 0L, TimeUnit.MILLISECONDS, new linkedBlockingQueue<Runnable>(), 3, TimeUnit.SECONDS);executorService.submit(new Callable<Object>(){ @Override public Object call() throws Exception { Thread.sleep(5000); System.out.println("Task done"); return null; }});executorService.shutdown();executorService.awaitTermination(1, TimeUnit.DAYS);System.out.println("Program done");它打印:
CancelledProgram done



