当前位置: 首页 > 知识库问答 >
问题:

如何在Java中找到第一个成功完成的线程的结果?

於乐语
2023-03-14
public class WorkerThread implements Runnable {
    @Override
    public void run() {
        // some long task here, returns int value
    }
}

public class Main {
    public static void main(String[] args){
         // initialize multiple worker threads here
         // then get result from the thread that completes first
    }
}

我查看了文档并找到了invokeAny ExecutorService,但这将返回任何已成功完成的线程的结果,而不一定是第一个线程。

共有1个答案

宰烈
2023-03-14

您还可以使用CountDownLatch和ExecutorService来实现这一点。

创建count=1的CountDownLatch对象。

CountDownLatch latch = new CountDownLatch(1);

使用ExecutorService池执行线程并在所有线程中传递锁存器。

workerThreadPool.execute(new WorkerThread(latch));
latch.await();
latch.countDown();
workerThreadPool.shutdownNow();
import static java.lang.Thread.sleep;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

class WorkerThread implements Runnable
{

    CountDownLatch _latch;

    public WorkerThread(CountDownLatch latch)
    {
        _latch = latch;
    }

    @Override
    public void run()
    {
        try
        {
            // some long task here, returns int value
            System.out.println("In thread1 " + this.toString());
            sleep(5000);
        }
        catch (InterruptedException ex)
        {
            System.out.println("thread1 interupted");
        }
        finally
        {

            System.out.println("Finished1 " + this.toString());
            _latch.countDown();
        }
    }
}

class WorkerThread2 implements Runnable
{

    CountDownLatch _latch;

    public WorkerThread2(CountDownLatch latch)
    {
        _latch = latch;
    }

    @Override
    public void run()
    {
        try
        {
            // some long task here, returns int value
            System.out.println("In thread2 " + this.toString());
            sleep(10000);
        }
        catch (InterruptedException ex)
        {
            System.out.println("thread2 interupted");
        }
        finally
        {

            System.out.println("Finished2 " + this.toString());
            _latch.countDown();
        }
    }
}

public class Main
{

    public static void main(String[] args) throws InterruptedException
    {
        ExecutorService workerThreadPool = Executors.newFixedThreadPool(2);

        CountDownLatch latch = new CountDownLatch(1);

        workerThreadPool.execute(new WorkerThread(latch));
        workerThreadPool.execute(new WorkerThread2(latch));

        latch.await();

        workerThreadPool.shutdownNow();
    }
}
 类似资料:
  • 如何测试线程?A有我的课,我想测试一下。我知道名单上有什么

  • 通常,对于CompletableFuture,我会调用thenApply或它的其他方法,以便在结果可用时立即执行某些操作。然而,我现在有一种情况,我想处理结果,直到我收到一个肯定的结果,然后忽略所有进一步的结果。 如果我只是想获取第一个可用的结果,我可以使用CompletableFuture.anyOf(尽管我讨厌为了调用anyOf而将列表转换为数组)。但那不是我想要的。我想取第一个结果,如果它没

  • 问题内容: 有什么方法可以简单地等待所有线程处理完成?例如,假设我有: 如何更改此方法,以便该方法在注释处暂停直到所有线程的方法退出?谢谢! 问题答案: 你将所有线程放入数组中,全部启动,然后进行循环 每个连接将阻塞,直到相应的线程完成为止。线程的完成顺序可能不同于你加入线程的顺序,但这不是问题:退出循环时,所有线程均已完成。

  • 问题内容: 在我的程序执行过程中,启动了多个线程。线程数量取决于用户定义的设置,但是它们都使用不同的变量执行相同的方法。 在某些情况下,需要在执行过程中进行清理,其中一部分是停止所有线程,尽管我不希望它们立即停止,我只是设置了一个变量来检查它们是否终止。问题在于线程停止之前最多可能需要1/2秒。但是,我需要确保所有线程都已停止,然后才能继续进行清理。清理是从另一个线程执行的,因此从技术上讲,我需要

  • 我有4条线。每个人每x秒打印给定的字母x次。任务是一次启动3个线程,在至少一个前一个线程完成时启动第四个线程。我不知道如何通知最后一个线程在适当的时间运行。

  • 我试着运行一个程序,使用线程显示带有数字的乘法、除法、加法和减法表。 但是我希望数字被乘以或相加等。由用户选择。 也就是说,程序应该在用户为每个操作选择一个数字后运行,然后显示结果。