[英]What is the correct way to perform long-running operation outside the EDT?
[英]What is the cleanest way to create, start, and manage long-running threads?
線程在代碼中添加了很多語言,使其更難理解和推理。 例如看這段代碼:
public class ConnectionListener implements Runnable {
private Thread thread;
private boolean running;
public void start() {
if (!running) {
thread = new Thread(this);
thread.start();
}
}
public void stop() {
if (running) {
running = false;
thread.interrupt();
}
}
@Override
public void run() {
running = true;
while (running) {
// Do some crap
}
}
}
這個 class 的全部關注點應該是監聽來自網絡的連接請求。 但是看看添加了多少行代碼只是為了管理一個線程。 有沒有辦法讓這段代碼更干凈?! 我不想看到thread = new Thread();
,不是線程變量,也不是任何stop()
/ start()
方法!
我當然知道ExecutorService
是什么……但是如果我想管理一個長時間運行的線程怎么辦? 所謂長時間運行的線程,我的意思是生命周期與應用程序的生命周期一樣長的線程。
你對我有什么好的解決方案嗎? 一種從 class 中消除線程創建和管理問題而不使 class 擴展另一個 class 的方法?
我通過使用單線程執行器服務解決了這個問題。 我還閱讀了Plain Thread
、 ThreadPool
和SingleThreadExecutor
- SingleThreadExecutor VS plain thread之間的性能差異。
使用單線程執行器允許我啟動一個線程並使用它的Future
管理它。 見代碼示例:
public void func(String[] args) {
ExecutorService es = Executors.newSingleThreadExecutor();
Future<?> f = es.submit(Some Runnable);
}
感謝@BasilBourque 在評論中給了我這個解決方案。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.