Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/394.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 一个被打断的执行者_Java_Multithreading_Interrupt_Executor - Fatal编程技术网

Java 一个被打断的执行者

Java 一个被打断的执行者,java,multithreading,interrupt,executor,Java,Multithreading,Interrupt,Executor,我每隔一段时间就要完成一项任务,比如说每3毫秒直到永远。 因此,在x的每个时间点,x+3,x+2*3,…,将调用方法m1的任务。 这一切都将发生在一个班级,比如说某个班级 我可以使用ScheduledThreadPoolExecutor及其scheduleAtFixedRate来执行此操作 但是,在这项计划任务期间,还可以做更多的工作。线程可能通过中断接收新的和未计划的信息。 当它这样做的时候,它必须做一些a。可能会通过scheduleAtFixedRate影响m1在这些计划时间的处理方式。 或

我每隔一段时间就要完成一项任务,比如说每3毫秒直到永远。 因此,在x的每个时间点,x+3,x+2*3,…,将调用方法m1的任务。 这一切都将发生在一个班级,比如说某个班级

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

但是,在这项计划任务期间,还可以做更多的工作。线程可能通过中断接收新的和未计划的信息。 当它这样做的时候,它必须做一些a。可能会通过scheduleAtFixedRate影响m1在这些计划时间的处理方式。 或者b。可以调用m1本身

在这个预定运行期间,我必须更新certan字段成员,比如SomeClass的field1和field2

一,。我在F行中对field1的值进行的更改是否已看到,即我是否按照我的预期方式递增某个类实例的field1的值

二,。我如何在这里看到对某个类实例的中断? 让anObj成为SomeClass的实例。将在应用程序的其他位置调用anObj.interrupt。当这种情况发生时, 我必须看到它,并在K行中做进一步的事情。我如何才能做到这一点

对执行者来说太新了

蒂亚

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

编辑:

我可以做到以下几点:

将类声明更改为

class SomeClass extends Thread {
这使我能够在K行中看到对anObj的中断:

if (SomeClass.this.interrupted());
我知道这不是一个好的做法,尽管我不知道为什么。这是可行的还是有更好的解决方案

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

编辑-2:


这里的中断不是为了交换信息。只是让线程知道发生了什么。被中断的线程将按照其条件调用的方式从那里开始

中断线程,而不是对象

要执行您想要的操作,最好的选择是取消未来对象

Future<?> future = trd.scheduleAtFixedRate(new Runnable() {
要测试线程是否被中断,可以执行以下操作

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

我被谁看见了?在您的版本中,它保证仅对同一线程中F行之后的代码可见。2线程交换数据的最常见和公认的方法是使用BlockingQueue的某些子类,而不是中断。请注意,如果anObj是未启动的线程,那么anObj.interrupt可能不会执行任何操作。此外,将被中断的线程(而不是对象)与ScheduledThreadPoolExecutor中运行的线程不同。如果您只是将其用于通知,那么您可能不会受到影响。旗帜可能更合适。
future.cancel(true);
if (Thread.currentThread().isInterrupted())