簡體   English   中英

創建、啟動和管理長時間運行的線程的最簡潔的方法是什么?

[英]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 ThreadThreadPoolSingleThreadExecutor - 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM