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