我需要一个 Java 执行器,如果正在处理其他任务,它会拒绝任务。我想不可能操纵工作队列大小。
有人可能会奇怪,为什么我首先需要一个具有这种特征的执行者。我需要能够轻松更改策略并允许非零队列大小。
有任何想法吗?
Use a 线程池执行器 http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ThreadPoolExecutor.html with a 同步队列 http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/SynchronousQueue.html(复制自这个答案 https://stackoverflow.com/a/10186825/3080094).
它似乎有效:
import java.util.concurrent.RejectedExecutionHandler;
import java.util.concurrent.Semaphore;
import java.util.concurrent.SynchronousQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
public class SingleTaskExecutor {
public static void main(String[] args) {
try {
new SingleTaskExecutor().runTest();
} catch (Exception e) {
e.printStackTrace();
}
}
public void runTest() throws Exception {
ThreadPoolExecutor tp = new ThreadPoolExecutor(1, 1,
60L, TimeUnit.SECONDS,
new SynchronousQueue<Runnable>());
tp.setRejectedExecutionHandler(new RejectedTaskHandler());
final Semaphore oneTaskDone = new Semaphore(0);
tp.execute(new Runnable() {
@Override public void run() {
System.out.println("Sleeping");
try { Thread.sleep(300); } catch (Exception e) { e.printStackTrace();}
System.out.println("Done sleeping");
oneTaskDone.release();
}
});
tp.execute(new Runnable() {
@Override public void run() { System.out.println("Never happends"); }
@Override public String toString() { return "Rejected Runnable"; }
});
oneTaskDone.acquire();
tp.execute(new Runnable() {
@Override public void run() { System.out.println("Running"); }
});
tp.shutdown();
tp.awaitTermination(100, TimeUnit.MILLISECONDS);
System.out.println("Finished");
}
static class RejectedTaskHandler implements RejectedExecutionHandler {
@Override public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {
System.out.println("Task rejected: " + r);
}
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)