gpt4 book ai didi

Java 执行器模型,仅允许在实例化线程上运行任务

转载 作者:行者123 更新时间:2023-12-02 12:58:51 24 4
gpt4 key购买 nike

我正在编写一个多线程应用程序,我遇到的情况是我有某些与库相关的方法,只能上运行 main-thread 。目前,我正在运行一个简单的、自行编写的解决方案,该解决方案监听队列中的任务,然后在任务进入时串行执行它们。

到目前为止,尽管当我需要返回值等时它会变得丑陋,但它仍然有效。(我目前正在通过将数据结构与任务一起传递来解决c-way,然后进行繁忙循环检查该结构是否已写入在对任务进行排队的方法的站点上。

这并不是真正最干净的解决方案,虽然它有效,但我希望找到更好的方法来做到这一点..

:JDK 或单个专用库中是否有任何东西可以满足我的需要?或者是否有任何编程模式可以以干净且结构化的方式满足我的需求?

最佳答案

使用CompletableFuture可能的解决方案:

class Job<T> {
private final Supplier<T> computation;
private final CompletableFuture<T> future;

Job(Supplier<T> computation, CompletableFuture<T> future) {
this.future = future;
this.computation = computation;
}

public Supplier<T> getComputation() {
return computation;
}

public CompletableFuture<T> getFuture() {
return future;
}
}

public void client() {
// on the client:
CompletableFuture<String> future = new CompletableFuture<>();
Supplier<String> computation = () -> "Here I am!";

enqueue(new Job<>(computation, future));

String resultString = future.get();
}

public <T> void server(Job<T> job) {
// on the server; job is taken from the queue
CompletableFuture<T> future = job.getFuture();
future.complete(job.getComputation().get());
}

这里,在客户端上,future.get() 将无限等待,直到结果可用。还有另一种形式:

future.get(1, TimeUnit.MINUTES)

只会等待一分钟,然后返回。这可用于轮询。

关于Java 执行器模型,仅允许在实例化线程上运行任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44353422/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com