我有一个ThreadPoolExecutor,它管理2个工作线程(Callables)。 My Worker线程作业是监听MQ并将内容写入文件并更新计数。我的要求是当所有线程读取的总消息等于提交的总消息时,我需要通过传递STOP消息来停止我的工作线程。如何在我的父线程中仍然运行时从我的工作线程获取计数。
我检查了ThreadPoolExecutor的API,它只有beforeExecute和afterExecute。 afterExecute对我不起作用,因为我的线程应该在到达AfterExecute之前先停止。
任何建议表示赞赏。
由于
答案 0 :(得分:2)
我认为,如果您的工作线程正在主动轮询新消息或正在为多个请求运行,那么您的方法是错误的。
Threadpoolexecutor
的想法是,Callable
表示一个任务(在您的示例中是:处理一条消息)。如果你这样做,你可以使用ThreadPoolExecutor.shutdown()
关闭你的工作线程。如果这样做,您只需要有一个中央实例,它跟踪预期的消息量和处理的消息,并在processed == expected
编辑:如果您遵循该模式,则不必监视线程状态,因为TPE.shutdown()
不会阻止执行已提交的任务,但只会禁止进一步提交。
答案 1 :(得分:1)
让父线程实例化AtomicInteger
并将其传递给工作人员。他们可以在其上调用incrementAndGet()
,然后父线程可以在运行时读取它。您甚至可以让工作线程检查incrementAndGet()
之后的结果是否小于阈值,如果结束,工作人员可以自行停止和/或向其他工作人员发出停止命令;这样,你甚至不需要父线程的参与,工作人员只有在达到门槛时才会自行关闭。
如果您希望父线程阻塞直到它们全部完成,您还可以创建一个使用阈值初始化的CountDownLatch
,然后在父线程调用时让每个工作程序调用{{1}} countDown()
。
答案 2 :(得分:1)
您可以使用静态变量,并从父线程和工作线程同步访问此静态变量。
让我们说,你有一个全局静态变量计数
现在,
private static int count;
public static synchronized void increment() {
count++;
}
public static synchronized void decrement() {
count--;
}
现在你是工作者therad,每当你从MQ获取一个项目并在你的工作线程中处理它时,通过调用snynchronized increment方法来增加它。
当你的父线程计数等于总数时。提交的项目,执行ThreadPoolExecutor.shutdown()