Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/379.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.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_Threadpoolexecutor - Fatal编程技术网

Java 不使用全局变量读取线程的当前状态

Java 不使用全局变量读取线程的当前状态,java,multithreading,threadpoolexecutor,Java,Multithreading,Threadpoolexecutor,我有一个ThreadPoolExecutor,它管理2个工作线程(可调用)。我的工作线程工作是侦听MQ并将内容写入文件并更新计数。我的要求是,当所有线程读取的消息总数等于提交的消息总数时,我需要通过传递停止消息来停止工作线程。当父线程仍在运行时,如何从父线程中的工作线程获取计数 我检查了ThreadPoolExecutor的API,它只有beforeExecute和afterExecute。afterExecute对我不起作用,因为在进入afterExecute之前应该先停止线程 如有任何建议,

我有一个ThreadPoolExecutor,它管理2个工作线程(可调用)。我的工作线程工作是侦听MQ并将内容写入文件并更新计数。我的要求是,当所有线程读取的消息总数等于提交的消息总数时,我需要通过传递停止消息来停止工作线程。当父线程仍在运行时,如何从父线程中的工作线程获取计数

我检查了ThreadPoolExecutor的API,它只有beforeExecute和afterExecute。afterExecute对我不起作用,因为在进入afterExecute之前应该先停止线程

如有任何建议,我们将不胜感激


谢谢

我认为,如果您的工作线程正在积极轮询新消息或正在运行多个请求,那么您走错了方向

Threadpoolexecutor
的思想是,
Callable
表示一个任务(在您的示例中是:处理一条消息)。如果这样做,可以使用
ThreadPoolExecutor.shutdown()
关闭workerthreads。如果这样做,您只需要有一个中心实例,它跟踪预期的消息量和处理的消息,并在
processed==expected


编辑:如果遵循该模式,则不必监视线程状态,因为
TPE.shutdown()
不会阻止已提交任务的执行,而只会禁止进一步提交

我认为,如果您的工作线程正在积极轮询新消息或正在运行多个请求,那么您走错了方向

Threadpoolexecutor
的思想是,
Callable
表示一个任务(在您的示例中是:处理一条消息)。如果这样做,可以使用
ThreadPoolExecutor.shutdown()
关闭workerthreads。如果这样做,您只需要有一个中心实例,它跟踪预期的消息量和处理的消息,并在
processed==expected


编辑:如果遵循该模式,则不必监视线程状态,因为
TPE.shutdown()
不会阻止已提交任务的执行,而只会禁止进一步提交

让父线程实例化并将其传递给工作线程。它们可以对其调用
incrementAndGet()
,然后父线程可以在其运行时读取它。您甚至可以让工作线程检查
incrementAndGet()
之后的结果是否小于阈值,如果超过阈值,工作线程可以停止自己和/或向其他工作线程发出停止命令;这样,您甚至不需要父线程的参与,当工作人员达到阈值时,他们将自己关闭


如果希望父线程阻塞直到它们全部完成,还可以创建一个使用阈值初始化的,然后让每个工作线程调用
countDown()
,而父线程调用
wait()
让父线程实例化一个,并将其传递给工作线程。它们可以对其调用
incrementAndGet()
,然后父线程可以在其运行时读取它。您甚至可以让工作线程检查
incrementAndGet()
之后的结果是否小于阈值,如果超过阈值,工作线程可以停止自己和/或向其他工作线程发出停止命令;这样,您甚至不需要父线程的参与,当工作人员达到阈值时,他们将自己关闭


如果希望父线程阻塞直到它们全部完成,还可以创建一个使用阈值初始化的线程,然后在父线程调用
await()时让每个工作线程调用
countDown()

您可以使用静态变量,并从父线程和工作线程同步访问此静态变量

假设您有一个全局静态变量count

现在,

现在,在worker therad中,无论何时从MQ获取一个项目并在中处理它,您的worker线程都会通过调用snynchronized increment方法来增加该项目


在您的父线程中,当计数等于提交的项目总数时,执行ThreadPoolExecutor.shutdown()

您可以使用静态变量,并从父线程和工作线程同步访问此静态变量

假设您有一个全局静态变量count

现在,

现在,在worker therad中,无论何时从MQ获取一个项目并在中处理它,您的worker线程都会通过调用snynchronized increment方法来增加该项目


在您的父线程中,当计数等于提交的项目总数时,执行ThreadPoolExecutor.shutdown()

当队列不再需要时,你不能在队列上设置一个标志,让工作线程在看到该标志时死亡吗?当队列不再需要时,你不能在队列上设置一个标志,让工作线程在看到该标志时死亡吗?谢谢Jonathan的回复。我的要求是有5个侦听器线程侦听MQ,每个线程将消息从队列写入输出文件。最后,父线程将合并所有这5个输出文件并发送电子邮件给它。我知道Callable应该代表一个任务,但如果我的队列中有5000条消息,那么将有5000个输出文件,我应该稍后合并这些文件。您认为是否有其他方法可以通过ThreadPoolExecutor实现这一点?再次感谢。我不确定Threadpool是否是解决您的问题的正确概念。为什么希望使用5个线程来加速应用程序?在不了解您的设置的情况下,很难提出建议。谢谢Jonathan的回复。我的要求是有5个t
private static int count;

public static synchronized void increment() {
    count++;
}

public static synchronized void decrement() {
    count--;
}