加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

Java是否提供了一个允许worker在同一个线程上执行的ExecutorServ

发布时间:2020-12-14 19:34:09 所属栏目:Java 来源:网络整理
导读:我正在寻找ExecutorService的实现,它将提供以下语义.每个线程都由“worker”占用,该“worker”根据输入执行某些任务.每个工作人员都保证只在一个线程中执行,因此,应该允许它在任务之间保持状态,而不需要同步开销,因为它将在一个线程中与自身同步. 所以,假设
我正在寻找ExecutorService的实现,它将提供以下语义.每个线程都由“worker”占用,该“worker”根据输入执行某些任务.每个工作人员都保证只在一个线程中执行,因此,应该允许它在任务之间保持状态,而不需要同步开销,因为它将在一个线程中与自身同步.

所以,假设我有100个输入,10个工人,我希望能够写出如下内容:

for (Input input: inputs) {
    // The following code would pass t to all 10 workers,// each bound to their own thread,// and wait for them to complete.
    executor.invokeAll(input);
}

请注意,每个Worker对任何给定的输入都做了不同的事情.输入不是可运行的代码块,它只是工作者的参数.每个工作人员决定如何处理输入.但是,为了使其更简单,工作人员实现了一个接口,允许以多态方式调用它,接收输入.

我使用Map< Worker,WorkerExecutor>一起攻击了一些有效的东西,其中WorkerExecutor是我在Executors.newSingleThreadPool周围的瘦包装器,并且每个线程池中只运行一个Worker实例.我宁愿找一些知道他们在做什么的人写的东西:-)

潜在的不足我很好

我意识到这种语义会导致效率低下,但是,我试图在开发时间方面获得最大的收益,并且重新设计Worker的每个实现都是线程安全的并非易事.我的意思是低效率是执行可能/看起来像这样(在这个例子中模拟最多2个活动线程):

| Task 1    | Task 2    | Task 3    | Task 4    |
Worker 1 | =@        | =@        | =@        | =@        |
Worker 2 | ==@       | ==@       | ==@       | ==@       |
Worker 3 |   ==@     |   ==@     |   ==@     |   ==@     |
Worker 4 |    =====@ |    =====@ |    =====@ |    =====@ |

问题是在工人3完成之后,没有剩下的任务要做,直到工人4完成才能完成工作.这可能是CPU可以闲置的任意长时间.

这样的ExecutorService是否存在?

解决方法

这听起来像你真正想要的是 actors.简而言之,一个actor是一个在一个线程中运行的对象,它有一个任务的“邮箱”,它负责按顺序处理. Akka似乎是目前在JVM上提供演员的领先库/框架.看看那边.还有 another SO answer列出了Java中几个演员的替代方案.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读