2016-07-29 36 views
1

我有一個應用程序從其他應用程序接收警報,通常一分鐘左右,但我需要能夠處理每分鐘更高的音量。我使用的接口和Alert框架通常要求警報可以異步處理,並且可以在異步處理警報時停止。停止方法具體記錄爲停止線程。我編寫了下面的代碼來創建AlertRunner線程,然後停止線程。但是,這是處理終止線程的正確方法嗎?此代碼是否能夠輕鬆擴展(不是可笑的音量,但可能同時發出第二個或多個提醒警報)?這是一種安全的方式來生成新線程並終止它們?

private AlertRunner alertRunner; 

@Override 
public void receive(Alert a) { 
    assert a != null; 
    alertRunner = new alertRunner(a.getName()); 
    a.start(); 
} 

@Override 
public void stop(boolean synchronous) { 
    if(!synchronous) { 
     if(alertRunner != null) { 
      Thread.currentThread().interrupt(); 
     } 
    } 
} 

class AlertRunner extends Thread { 
    private final String alertName; 

    public AlertRunner(String alertName) { 
     this.alertName = alertName; 
    } 

    @Override 
    public void run() { 
     try { 
      TimeUnit.SECONDS.sleep(5); 
      log.info("New alert received: " + alertName); 
     } catch (InterruptedException e) { 
      log.error("Thread interrupted: " + e.getMessage()); 
     } 
    } 
} 
+0

我想知道是否Thread.currentThread()。interrupt();'做了你認爲它的作用。它所做的是,它會在調用你的stop()方法的線程中設置_interrupted標誌_。我懷疑的原因是,很少有任何理由讓線程自行中斷。 –

回答

2

由於Thread是相當「重」的對象,所以此代碼不會輕易縮放。創建起來很昂貴,而且開始很昂貴。爲您的任務使用ExecutorService要好得多。它將包括準備處理您的請求的線程數量有限:

int threadPoolSize = 5; 
ExecutorService executor = Executors.newFixedThreadPool(threadPoolSize); 

public void receive(Alert a) { 
    assert a != null; 
    executor.submit(() -> { 
     // Do your work here 
    }); 
} 

這裏executor.submit()將處理在一個單獨的線程您的請求。如果所有線程現在都處於繁忙狀態,請求將在隊列中等待,從而防止資源耗盡。它還會返回Future的實例,您可以使用該實例等待處理完成,設置超時,接收結果,取消執行以及許多其他有用的事情。

+0

謝謝,這就是我正在尋找的!當我取消執行時,它是否取消了應該取消的一個警報的執行? – SVN600

+0

是的,在Future中調用'cancel()'取消特定任務:'Future f = executor.submit(( - ){...});'然後'f.cancel(true) –

相關問題