我有一個任務要完成每隔一段時間,比如說每3毫秒直到永遠。 因此,在x,x + 3,x + 2 * 3,...的每個時間點,將調用方法爲m1()
的任務。 這將全部發生在一個班級,比如SomeClass
中斷執行器和更多
我可以使用ScheduledThreadPoolExecutor
及其scheduleAtFixedRate()
來做到這一點。
然而,可以有更多這樣的計劃任務期間完成。線程可能會通過中斷接收新的和未計劃的信息。 然後,它必須做某些事情,a。)可能影響m1()
在這些預定時間處理scheduleAtFixedRate()
的方式。 或b。)可以調用m1()
本身。
在此計劃運行期間,我將不得不更新certan字段成員,例如field1
和field2
SomeClass
。
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:
中斷這裏並不是用於交換信息。讓線程知道發生的事情。被中斷的線程將按照其條件調用的方式從那裏開始。
1)看到誰?在你的版本中,它只能保證在同一個線程中'line-F'後面的代碼可見。 2)線程交換數據的最常見和可接受的方法是使用'BlockingQueue'的一些子類,而不是通過中斷。 – 2014-10-11 15:31:34
請注意,[中斷不活動的線程不需要任何效果。](http://docs.oracle.com/javase/8/docs/api/java/lang/Thread.html#interrupt-- )因此,如果'anObj'是一個未啓動的'Thread',你的'anObj.interrupt()'可能不會做任何事情。更重要的是,將被中斷的**線程**(不是對象)與'ScheduledThreadPoolExecutor'內運行的線程不同。如果你只是用它來通知,你可能會逃避它。一面旗子可能更適合。 – 2014-10-11 15:44:27