我有一项任务要在每隔一段时间内完成,比如说每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
i' m" line-F"的值的变化。看到了,即我按照我想要的方式递增field1
这个实例SomeClass
的值?
2。)我怎样才能在这里看到SomeClass这个实例的中断?
让anObj
成为SomeClass
的实例。申请中的其他地方会有anObj.interrupt()
来电。当发生这种情况时
我必须在" line-K"中看到它并做更多的事情。我怎样才能做到这一点?
对Executor
来说太新了。
TIA。
// =============================
编辑:
我可以做以下事情:
将类声明更改为
class SomeClass extends Thread {
这允许我通过K行中的以下内容查看anObj
的中断:
if (SomeClass.this.interrupted());
我知道这不是一个好习惯,虽然我不知道为什么。这会有或有更好的解决方案吗?
// ============================================= ====
EDIT-2:
此处的中断不是用于交换信息。让线程知道发生的事情。被中断的线程将以其条件调用的方式从那里开始。
答案 0 :(得分:0)
你打断线程,而不是对象。
要做你想要的最好的选择是取消Future对象
Future<?> future = trd.scheduleAtFixedRate(new Runnable() {
您可以稍后执行以下操作取消该任务,如果已经在运行
,则将其中断future.cancel(true);
要测试线程是否已被中断,您可以执行
if (Thread.currentThread().isInterrupted())