首页 > 解决方案 > 如何将队列从另一个线程添加到一个线程?

问题描述

我正在尝试找到一种将队列从不同线程添加到一个线程的方法。

这是一个例子:

public void actionPerformed(ActionEvent e) {
    System.out.println("something happened.");
}

我相信该方法actionPerformed将始终在 EDT 中执行,但由于该方法中的代码与摆动无关,我想将其安排到不同的线程。

有一种方法可以让您在 EDT 中安排任务,例如:

SwingUtilities.invokeLater(new Runnable() {
    public void run() {
        //insert some code that does something in EDT
    }
});

有没有办法做同样的事情,但对于一个普通的线程?

标签: javamultithreading

解决方案


如果您对要使用的后台线程没有特别的偏好,请尝试使用ForkJoinPoolcommon pool

静态commonPool()可用且适用于大多数应用程序。ForkJoinTask未明确提交到指定池的任何人都使用公共池。使用公共池通常会减少资源使用(其线程在不使用期间缓慢回收,并在后续使用时恢复)。

您可以通过多种不同方式提交作业。我建议通过CompletableFuture它来检查工作的状态和结果。它的所有xxxAsync()方法都将任务提交到 fork-join 公共池。

如果您不关心结果,您可以简单地调用runAsync()即发即弃样式:

CompletableFuture.runAsync(() -> {
    System.out.println("something happened.");
});

或者,如果您想计算线程外的值,您可以使用方法链接在作业完成时采取行动:

CompletableFuture.supplyAsync(() -> {
    // expensive computation
    return result;
})
.whenComplete((result, exception) -> {
    if (exception == null) {
        System.out.println("result is " + result);
    }
    else {
        // something went wrong
        exception.printStackTrace();
    }
});

推荐阅读