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

时间:2013-08-08 19:57:59

标签: java multithreading threadpoolexecutor

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

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

任何建议表示赞赏。

由于

3 个答案:

答案 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()