在swing应用程序中,我想重新利用生成的线程,而不是创建一个新的线程来处理请求。这是因为请求将在很短的时间间隔内完成,并且为每个请求创建新线程的成本可能很高。
我正在考虑使用interrupt()和sleep()方法执行此操作,如下所示,并希望了解代码的任何潜在性能问题:
public class MyUtils {
private static TabSwitcherThread tabSwitcherThread = null;
public static void handleStateChange(){
if(tabSwitcherThread == null || !tabSwitcherThread.isAlive()){
tabSwitcherThread = new TabSwitcherThread();
tabSwitcherThread.start();
}
else
tabSwitcherThread.interrupt();
}
private static class TabSwitcherThread extends Thread{
@Override
public void run() {
try {
//Serve request code
//Processing complete, sleep till next request is received (will be interrupted)
Thread.sleep(60000);
} catch (InterruptedException e) {
//Interrupted execute request
run();
}
//No request received till sleep completed so let the thread die
}
}
}
由于
答案 0 :(得分:10)
我不会使用sleep()
和interrupt()
- 如果我绝对必须,我会使用wait()
和notify()
。
但是,是否真的需要这样做而不是使用可以为您处理线程重用的ThreadPoolExecutor
?或者也许以生产者/消费者的方式使用BlockingQueue
?
Java已经为此提供了足够的更高级别的构建块,您不需要自己降低到这个级别。
答案 1 :(得分:4)
我认为你正在寻找的是一个ThreadPool。 Java 5及更高版本附带ThreadPoolExecutor。我建议你使用Java提供的内容而不是编写自己的内容,这样你就可以节省大量的时间和精力。
当然,如果你绝对必须按照你描述的方式去做(嘿,有时候业务要求会让我们的生活变得艰难),那么就像Jon建议的那样使用wait()和notify()。我不会在这种情况下使用sleep(),因为你必须指定超时,并且你永远不知道下一个请求何时进入。有一个不断唤醒的线程然后再回到睡眠状态似乎有点浪费我的CPU周期。
这是关于ThreadPoolExecutor的nice tutorial。
编辑:
以下是一些代码示例:
public class MyUtils {
private static UIUpdater worker = null;
private static ExecutorService exeSrv = Executors.newFixedThreadPool(1);
public static void handleStateChange(){
if(tabSwitcherThread == null || !tabSwitcherThread.isAlive()){
worker = new UIUpdater();
}
//this call does not block
exeSrv.submit(worker, new Object());
}
private static class UIUpdater implements Runnable{
@Override
public void run() {
//do server request and update ui.
}
}
}