Java主线程管理启动其他线程

3

我会描述我的问题:

  • 我正在开发一个用于文档生成(办公文档)的异步模式应用程序,因此我使用线程

  • 由于性能限制,我必须同时启动仅2个线程,

  • 为了不阻止用户在两个线程运行时启动文档生成,我想开发一个包含ArrayDeque对象作为线程堆栈的主线程,在其中用户可以添加创建请求(作为实现Collable或Runnable接口的对象),并使用Concurrent API以FIFO模式启动线程

    问题是:

  • 如何确保主线程对所有用户都是单例?

  • 如何在主运行线程上调用ArrayDeque?

1个回答

9
听起来像是一个简单的使用含有两个线程池的ExecutorService的情况:
class Task implements Runnable {
    ...
}

ExecutorService exec = Executors.newFixedThreadPool(2);
exec.submit(new Task()); // submit task to the queue for asynchronous processing

ExecutorService 将封装一组线程池和工作队列。线程将自动在完成前一个任务后接收新的工作。


谢谢Tudor,实际上,ExecutorService不会提交新任务,除非前两个添加的任务完成,以避免崩溃JVM。 - KimB
2
@Karbala 任务会立即提交到队列中,但只有在其中一个工作线程空闲时才会被处理。 - Mark Rotteveel
@Mark:好的,这样做不会在启动进程时锁定其他用户吗?我的意思是,当他点击生成文档时,不会有等待过程直到其他线程完成吗?目的是不要锁定用户界面,希望你能理解我。谢谢 - KimB
2
@Karbala 任务被添加到一个无限队列中,因此发出新任务的线程不必等待旧任务完成。 - Patricia Shanahan
@Patricia:这正是我所需要的。最新的线程等待之前的线程完成,因此我想为所有用户使用一个唯一的ArrayDeque<? extends Callable>。 - KimB
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接