此问题的公认答案允许您将批处理工作提交到后台线程。这可能是一个更好的模式:
public abstract class dispatcher<T> extends Thread {
protected abstract void processItem(T work);
private List<T> workItems = new ArrayList<T>();
private boolean stopping = false;
public void submit(T work) {
synchronized(workItems) {
workItems.add(work);
workItems.notify();
}
}
public void exit() {
stopping = true;
synchronized(workItems) {
workItems.notifyAll();
}
this.join();
}
public void run() {
while(!stopping) {
T work;
synchronized(workItems) {
if (workItems.empty()) {
workItems.wait();
continue;
}
work = workItems.remove(0);
}
this.processItem(work);
}
}
}
要使用此类,请对其进行扩展,提供 T 的类型和 processItem() 的实现。然后只需构造一个并调用 start() 就可以了。
您可以考虑添加一个 abortPending 方法:
public void abortPending() {
synchronized(workItems) {
workItems.clear();
}
}
对于那些用户已经跳过渲染引擎并且你想扔掉到目前为止已经安排好的工作的情况。