我正在编写一个多线程应用程序,我遇到的情况是我有某些与库相关的方法只能 {{1} }}。目前,我正在运行一个简单的,自编写的解决方案,它可以在队列中侦听任务,然后在它们进入时以串行方式执行它们。
这到目前为止虽然在我需要返回值等时会变得很难看。(我现在通过传递带有任务的数据结构来解决c-way然后进行繁忙循环检查是否已将结构写入在排队任务的方法的网站上。
这不是最干净的解决方案,虽然它有效,但我希望能找到更好的方法来实现这一目标。
问:JDK或单一专用库中有什么东西可以满足我的需求吗?或者是否有任何编程模式以干净和结构化的方式满足我的需求?
答案 0 :(得分:1)
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)
只会等待一分钟后再返回。这个可以用于民意调查。
答案 1 :(得分:0)
让你的主线程扮演执行者的角色:
static ArrayBlockingQueue<Runnable> queue = new ArrayBlockingQueue<>(10);
public static void main(String... args) {
// initialization...
for (;;) {
queue.take().run();
}
}
每当您需要在主线程上执行任务时,请将其放入队列:
queue.add(()->methodCall(1,2,3));
答案 2 :(得分:0)
我不确定你是如何分时主线程的,但你所说的是你想要在主线程上依次使用多个线程和其他作业来运行一些作业。
最简单的答案是使用两个不同的工作队列 - 一个由多个线程提供服务,另一个仅由主线程服务。
这将使两个队列更容易理解和使用。
此外,在任一队列上运行的作业都应该实现一个接口,要求它们公开一个方法,该方法返回对结果数据的引用 - 这可能是实际结果或文件名或附加到包含该文件的文件的输入流结果