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

Java执行器模型,只允许在实例化线程上运行任务,java,multithreading,task,scheduling,Java,Multithreading,Task,Scheduling,我正在编写一个多线程应用程序,我遇到了这样的情况:我有一些与库相关的方法,这些方法只能在主线程上运行。目前,我正在运行一个简单的、自行编写的解决方案,该解决方案监听队列中的任务,然后在任务进入时串行执行它们 到目前为止,这是可行的,尽管当我需要返回值等时,它会变得很难看。我目前正在通过将数据结构与任务一起传递,然后进行繁忙的循环,检查结构是否已在对任务进行排队的方法的站点上写入 这并不是最干净的解决方案,虽然有效,但我希望找到更好的方法 问:JDK或单个专用库中是否有任何东西可以满足我的需要?或

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

到目前为止,这是可行的,尽管当我需要返回值等时,它会变得很难看。我目前正在通过将数据结构与任务一起传递,然后进行繁忙的循环,检查结构是否已在对任务进行排队的方法的站点上写入

这并不是最干净的解决方案,虽然有效,但我希望找到更好的方法

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

一种可能的解决方案,具有完全的未来:


只等一分钟就回来了。这可用于轮询。

让主线程扮演执行者的角色:

static ArrayBlockingQueue<Runnable> queue = new ArrayBlockingQueue<>(10);
public static void main(String... args) {
    // initialization...
    for (;;) {
        queue.take().run();
    }
}

我不确定您是如何对主线程进行时间切片的,但您要说的是,您希望使用多个线程和主线程上的其他作业顺序运行某些作业

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

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


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

为什么不向现有体系结构添加未来?传递一个CompletableFuture,而不是与轮询相关的结构。然后cilent可以使用get方法等待或轮询它。@RomanPuchkovskiy我想我不知道从哪里开始实现未来的机制。也许我想得太远了。。。。。除非我有一个绝妙的想法,简单地使用一个信号量作为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));