繁体   English   中英

在Java中如何为多个线程创建公共进度指示器

[英]in java how to create a common progress indicator for multiple threads

如果我有5个正在工作的线程,并且当他们开始工作时,它们会发送一个progress-start命令给可以说开始旋转的进度轮。 线程停止工作时,它将进度停止发送到转轮。

可以很容易地看到,由于最后一个仍在工作的线程的进度开始已被最后一个停止的线程删除,因此这将不起作用。

我在考虑某种堆栈fifo / lifo实现,以记住什么线程在做什么,然后正确地告诉进度轮应该处于什么状态。

但这感觉像是坏了,记住了线程状态。

也许进度轮可以每3秒定期运行一个计时器,以检查线程是否处于活动状态。

您可以做的一件事就是拥有CountDownLatch。 CountDownLatch的好处是,您可以将ProgressWheel设置为新线程,并且主线程将一直等待直到计数器达到0。每个WorkerThread都将在其构造函数中传递CountDownLatch并在运行时对其进行递减计数方法完成。

如果工作线程不是一次全部启动,则必须使用一个计数器,在线程结束时将其递减,在一次启动时将其递增并在进度轮中轮询其值。

这是示例代码

public static void main(String[] args) {
    ProgressWheel wheel = new ProgressWheel();
    CountDownLatch latch = new CountDownLatch(3);
    wheel.start();
    new WorkerThread(latch).start(); 
    new WorkerThread(latch).start();
    new WorkerThread(latch).start();
    try {
        latch.await(); //wait until counter reaches 0
    } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    wheel.stop();

}

private static class WorkerThread extends Thread{
    private CountDownLatch counter;
    public WorkerThread(CountDownLatch counter) {
        this.counter = counter;
    }

    @Override
    public void run() {
        //Do some heavy work
        counter.countDown(); //This thread is finished
    }
}

我建议在使用线程时避免使用堆栈或任何其他依赖顺序的操作,几乎无法保证线程完成的顺序。

而是尝试使用Future接口来跟踪线程完成情况。 例如,当每个线程向进度轮发出信号说它已经完成时,进度轮可以在先前已调用的任何其他任务上调用Future.isDone()以确定它是否应该停止。

使用Future接口的另一个优点是,您可以捕获任务抛出的任何异常或错误(例如InterruptedExceptionExecutionException ),然后将适当的消息发送到进度盘。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM