具有中断等的执行程序

时间:2014-10-11 15:27:09

标签: java multithreading interrupt executor

我有一项任务要在每隔一段时间内完成,比如说每3毫秒就要永远。 因此,在x,x + 3,x + 2 * 3,...的每个时间点,将调用作为方法m1()的任务。 这将全部发生在课堂上,比如说SomeClass

我可以使用ScheduledThreadPoolExecutor及其scheduleAtFixedRate()来执行此操作。

但是,在此计划任务期间可能还有更多工作要做。线程可以通过中断接收新的和未安排的信息。 当它发生时,它必须做某些事情,a。)可能影响m1()scheduleAtFixedRate()那些预定时间处理的方式。 或b。)可以调用m1()本身。

在此预定的运行期间,我必须更新certan字段成员,例如field1field2 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:

此处的中断不是用于交换信息。让线程知道发生的事情。被中断的线程将以其条件调用的方式从那里开始。

1 个答案:

答案 0 :(得分:0)

你打断线程,而不是对象。

要做你想要的最好的选择是取消Future对象

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

您可以稍后执行以下操作取消该任务,如果已经在运行

,则将其中断
future.cancel(true);

要测试线程是否已被中断,您可以执行

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