循环使用CyclicBarrier的问题(标题不太好,请进来看看详细问题)

villagehead 2014-06-25 04:18:28
我需要写一个任务,
1、这里任务每次执行分2个线程去干活。
2、(当这2个线程都结束了以后)等待10秒,
再进行这个任务。
也就是12121212这样循环着执行下去。

“同时结束后再做什么什么任务”这个需求,
可以使用CyclicBarrier来实现。

但是,我怎么实现“一直循环”这个需求啊?

下面贴出来的是我的代码。
只完成了CyclicBarrier提供的“都结束了才是真结束”的功能。

求教怎么让这个任务一直循环执行下去呢?

代码奉上:

package test.thread.newfunction;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class CyclicBarrierTest3 {

public CyclicBarrierTest3(){

CyclicBarrier barrier = new CyclicBarrier(2, new Runnable() {

@Override
public void run() {
System.out.println("所有线程都执行完了!");
}
});

ExecutorService exec = Executors.newFixedThreadPool(2);

Task t1 = new Task(barrier, 1, 3000);
Task t2 = new Task(barrier, 2, 1000);

exec.submit(t1);
exec.submit(t2);

exec.shutdown();
}


static String now() {
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
return sdf.format(new Date()) + ": ";
}

static class Task implements Runnable {

private int threadNo = -1;
private int time = 0;

private CyclicBarrier barrier;

public Task(CyclicBarrier barrier, int threadNo, int time) {
this.barrier = barrier;
this.threadNo = threadNo;
this.time = time;
}

public void run() {

try {
System.out.println(now() + "第" + threadNo + "号线程在执行");
Thread.sleep(time);
System.out.println(now() + "第" + threadNo + "号线程执行完毕!!! 花费" + (time/1000) + "秒");
barrier.await();


} catch (InterruptedException e) {
} catch (BrokenBarrierException e) {
}
}
}

public static void main(String[] args) {
new CyclicBarrierTest3();
}
}
...全文
1608 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
lliiqiang 2014-06-30
  • 打赏
  • 举报
回复
应当有一个主线程,每次启动2个子线程,等待2个子线程都结束的时候再重新建立新的2个子线程再启动.
业余草 2014-06-27
  • 打赏
  • 举报
回复
CyclicBarrier这个事个什么东西,不明白,没有用过的哦
冰思雨 2014-06-26
  • 打赏
  • 举报
回复
楼主开始的那个程序是两个线程通过栅栏相互等待,如果循环执行的话,就要控制线程也参与等待才行, 所以,栅栏的参数+1,更改成3,控制线程形成循环结构,为避免死循环,暂时设定10次。 线程池什么的,不用动。
冰思雨 2014-06-26
  • 打赏
  • 举报
回复
	public CyclicBarrierTest3() {

		CyclicBarrier barrier = new CyclicBarrier(3, new Runnable() {

			@Override
			public void run() {
				System.out.println("所有线程都执行完了!");
			}
		});

		ExecutorService exec = Executors.newFixedThreadPool(2);

		for(int i=0;i<10;i++){//循环10次试试
			barrier.reset();
			Task t1 = new Task(barrier, 1, 3000);
			Task t2 = new Task(barrier, 2, 1000);
	
			exec.submit(t1);
			exec.submit(t2);
			try {
                barrier.await();
                System.out.println(now() + "一次循环已经搞定啦。");
            } catch (InterruptedException e) {
            } catch (BrokenBarrierException e) {
            }
		}
		exec.shutdown();
	}
tony4geek 2014-06-26
  • 打赏
  • 举报
回复
最主要是判断2个都结束的/
疯癫行者 2014-06-26
  • 打赏
  • 举报
回复
上面是举个例子示范一下,你自己根据需要修改一下。
疯癫行者 2014-06-26
  • 打赏
  • 举报
回复

while(true){
    ExecutorService exec = Executors.newFixedThreadPool(2);
         
        Task t1 = new Task(barrier, 1, 3000);
        Task t2 = new Task(barrier, 2, 1000);
         
        exec.submit(t1); 
        exec.submit(t2); 
         
        exec.shutdown();
        while(true){        
            if(exec.isTerminated()){ break;} else(Thread.sleep(100);)
        }
}
villagehead 2014-06-26
  • 打赏
  • 举报
回复
我在想能不能在外围再用一个count=1的CountDownLatch。 再把我那个类方法 把现在写在一个有返回值的方法里。 然后外围程序用callable-future方式调用, future有返回值了,就让CountDownLatch执行countDown()。 countDown调用完后,再执行初始化那个类的代码。 如此反复。 不知道行不行。 对了,那个exec.shutdown也应该放在一个得到了future的结果之后再调用, 也就是把那个匿名runnable接口对象返回一个值.... 好乱啊!! 还有什么别的实现方法吗?
zgycsmb 2014-06-26
  • 打赏
  • 举报
回复
7楼的应该可以吧, 学习,接分.
  • 打赏
  • 举报
回复
一直循环就用定时器,不过在定时器结束到定时器开始这段时间里,如何保证你的线程已经正常死掉就不太好控制了。
疯癫行者 2014-06-25
  • 打赏
  • 举报
回复
“但是,我怎么实现“一直循环”这个需求啊?” 在最外面加个循环咯

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧