2017-06-04 66 views
0

我写一个多线程应用程序,我已经得到了我有一定的图书馆相关的方法,可以只有main-thread运行情况运行任务的Java执行模型。目前我正在运行一个简单的,自写的解决方案,在队列中侦听任务,然后在进入时连续执行它们。,只允许上实例线程

虽然它在我需要返回值时变得很难看,我目前正在通过将任务传递给数据结构来解决c-way问题,然后在结构已经写入排队任务的方法的站点上时进行繁忙循环检查。最干净的解决方案,虽然它的工作原理,我希望找到一个更好的方式做到这一点..

问题:是否有任何在JDK或在单一专业图书馆,做我所需要的?或者是否有任何编程模式能够以清晰和结构化的方式满足我的需求?

+0

为什么不把期货添加到您现有的架构中?传递'CompletableFuture'而不是该轮询相关的结构。然后可以使用'get()'方法通过静音等待(或者轮询)。 –

+0

@RomanPuchkovskiy我想我不知道从哪里开始实施未来的机制。也许我想得太过分了.....除非我有一个聪明的想法,简单地使用信号量作为get方法的一种等待锁:/ –

+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) 

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

+0

这是野生的。我其实并没有意识到实施期货。只见过接口。 –

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)); 
0

我不是确定你如何对主线程进行时间分割,但是你所说的是你想要在主线程上依次使用多个线程和其他作业来运行一些作业。

最简单的答案是使用两个不同的工作队列 - 一个由多个线程提供服务,另一个由只有主线程提供服务。

这将使两个队列更容易理解和使用。

此外,在任一队列上运行的作业都应该实现一个接口,该接口要求它们公开一个方法,该方法返回对结果数据的引用 - 这可能是实际结果或附加到文件的文件名或输入流结果。