2014-10-11 34 views
0

我有一個任務要完成每隔一段時間,比如說每3毫秒直到永遠。 因此,在x,x + 3,x + 2 * 3,...的每個時間點,將調用方法爲m1()的任務。 這將全部發生在一個班級,比如SomeClass中斷執行器和更多

我可以使用ScheduledThreadPoolExecutor及其scheduleAtFixedRate()來做到這一點。

然而,可以有更多這樣的計劃任務期間完成。線程可能會通過中斷接收新的和未計劃的信息。 然後,它必須做某些事情,a。)可能影響m1()在這些預定時間處理scheduleAtFixedRate()的方式。 或b。)可以調用m1()本身。

在此計劃運行期間,我將不得不更新certan字段成員,例如field1field2SomeClass

class SomeClass { 
int field1, field2;  

void m1() {...} 

void theOne() { 
    ScheduledThreadPoolExecutor trd = new ScheduledThreadPoolExecutor(1); 
    trd.scheduleAtFixedRate(new Runnable() { 
     public void run() { 
      field1++; // line-F 
      m1(); 
      // line-K 
      // whatever else here 
     } 
    }, 0, freq, TimeUnit.MILLISECONDS); 


} // theOne() 

} // SomeClass 

1)是的field1值的變化我正在做的「行-F」可見,即我是遞增的SomeClass此實例的field1值我打算的方式嗎?

2)我怎麼能看到的中斷來這裏SomeClass的這種情況? 讓anObj成爲SomeClass的一個實例。在應用程序的其他地方將撥打anObj.interrupt()。當發生這種情況時, 我必須看到它,並在「K線」中做更多的事情。我怎樣才能做到這一點?

太新Executor

TIA。

// =============================

編輯:

我可以做以下:

改變類聲明

class SomeClass extends Thread { 

這讓我看到了中斷,anObj與K線以下:

if (SomeClass.this.interrupted()); 

我知道這不是一個好的做法,雖然我不知道爲什麼。這會做還是有更好的解決方案?

// ============================================ =====

EDIT 2:

中斷這裏並不是用於交換信息。讓線程知道發生的事情。被中斷的線程將按照其條件調用的方式從那裏開始。

+0

1)看到誰?在你的版本中,它只能保證在同一個線程中'line-F'後面的代碼可見。 2)線程交換數據的最常見和可接受的方法是使用'BlockingQueue'的一些子類,而不是通過中斷。 – 2014-10-11 15:31:34

+0

請注意,[中斷不活動的線程不需要任何效果。](http://docs.oracle.com/javase/8/docs/api/java/lang/Thread.html#interrupt-- )因此,如果'anObj'是一個未啓動的'Thread',你的'anObj.interrupt()'可能不會做任何事情。更重要的是,將被中斷的**線程**(不是對象)與'ScheduledThreadPoolExecutor'內運行的線程不同。如果你只是用它來通知,你可能會逃避它。一面旗子可能更適合。 – 2014-10-11 15:44:27

回答

0

您中斷線程,而不是對象。

做你想要什麼,最好的選擇是取消Future對象

Future<?> future = trd.scheduleAtFixedRate(new Runnable() { 

以後,您可以執行以下步驟來取消任務,中斷它,如果已經運行

future.cancel(true); 

測試如果一個線程被中斷,你可以做

if (Thread.currentThread().isInterrupted())