我正在编写一个多线程应用程序,其中我有某些与库相关的方法,可以 <> be 在<<上运行/em> main-thread
。目前,我正在运行一个简单,自编写的解决方案,该解决方案在任务队列上听,然后在它们进入时串行执行它们。
这起作用到目前为止,尽管当我需要返回值等时它变得丑陋。在排队任务的方法的网站上。
这并不是最清洁的解决方案,在起作用的同时,我希望找到一种更好的方法。
q :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)
只会等待一分钟,然后返回。这可用于轮询。
让您的主线程扮演执行人的角色:
static ArrayBlockingQueue<Runnable> queue = new ArrayBlockingQueue<>(10);
public static void main(String... args) {
// initialization...
for (;;) {
queue.take().run();
}
}
每当您需要在主线程上执行任务时,将其放在队列中:
queue.add(()->methodCall(1,2,3));
我不确定您是如何时间切好主线程的,但是您要说的是您要使用多个线程和其他主题上的其他作业运行一些作业。
最简单的答案是使用两个不同的工作队列 - 一个由多个线程提供服务,一个仅由主线程提供。
这将使两个队列更容易理解和使用。
另外,在任一队列上运行的作业都应实现一个接口,要求他们公开返回对结果数据的参考的方法 - 这可能是实际结果或文件名或附加到包含包含该文件的输入流结果。