一旦内部的线程完成,就重启线程

时间:2016-01-23 12:23:06

标签: java multithreading threadpool

我有线程x我就是这样开始的:

ScheduledExecutorService exec = Executors.newSingleThreadScheduledExecutor();
    exec.scheduleAtFixedRate(() -> {

x内,我有CyclicBarrier另外10个帖子:

final CyclicBarrier _threadGate = new CyclicBarrier(10);
ArrayList<Thread> _threadList = new ArrayList<>();

然后我将线程添加到列表

for (int i = 0; i < 10; i++) {
_threadList.add(new Thread() {
    @Override
        public void run() {
              _threadGate.await();
              //long processing code

所以在线程准备好之后我启动它们,它们同时启动很重要(差不多,循环需要时间,即使它是0,01ms):

for (int i = 0; i < _threadList.size(); i++) {
   _threadList.get(i).start();
}

现在,主线程x的结尾是这样的:

}, 0, repeatTimer, TimeUnit.SECONDS);

如果repeatTimer300,则表示它在5分钟后再次启动10个线程。

10个线程完成的时间是一个未知的数量,但它不到5分钟。肯定会在2到4分钟之间。

我想要实现的目标

完成10个线程后,重启X但延迟5秒 为此,我一直在考虑将repeatTimer值设置为10个线程+ 5秒的时间(我不知道该怎么做,我不知道最后一个线程完成它的任务),但这是正确?还是有另一种方式吗?

1 个答案:

答案 0 :(得分:1)

我没有看到在这里/^(\+?!1)?!(8(00|44|55|66|77|88)[2-9]\d{6})$/ if ( phoneNumbers/not().match(/^(\+?1)?(8(00|44|55|66|77|88)[2-9]\d{6})$/) && data.results[i].duration > 90 && data.results[i].disposition === "ANSWERED") { console.log(phoneNumbers); } 的必要性。您可以等到所有线程使用CountDownLatch完成其工作。

这是一个简单的例子:

SchedulingExecutorService

在每个线程的最后一个动作中减少锁存器:

while (!stopped) {
    CountDownLatch latch = new CountDownLatch(N);
    // create and start your threads
    latch.await(); // this method blocks until each Thread calls countDown()
    // wait here 5 seconds if you want
}