黑马程序员技术交流社区
标题:
CyclicBarrier的getNumberWaiting方法的问题???
[打印本页]
作者:
王竞
时间:
2014-3-27 17:32
标题:
CyclicBarrier的getNumberWaiting方法的问题???
public class CyclicBarrierTest {
public static void main(String[] args) {
ExecutorService service = Executors.newCachedThreadPool();
final CyclicBarrier cb = new CyclicBarrier(5);
for(int i = 0; i < 5; i++) {
Runnable runnable = new Runnable() {
@Override
public void run() {
try {
Thread.sleep(3 * 1000);
//为什么cb.getNumberWaiting()方法得到等待的线程的数据不正确呢????
System.out.println("线程" + Thread.currentThread().getName() + "即将到达集合地点1,当前已有" + (cb.getNumberWaiting() + 1) + "已经到达," + (cb.getNumberWaiting() == 4 ? "都到齐了,继续走吧" : "正在等待"));
cb.await();
Thread.sleep(3 * 1000);
System.out.println("线程" + Thread.currentThread().getName() + "即将到达集合地点2,当前已有" + (cb.getNumberWaiting() + 1) + "已经到达," + (cb.getNumberWaiting() == 4 ? "都到齐了,继续走吧" : "正在等待"));
cb.await();
Thread.sleep(3 * 1000);
System.out.println("线程" + Thread.currentThread().getName() + "即将到达集合地点3,当前已有" + (cb.getNumberWaiting() + 1) + "已经到达," + (cb.getNumberWaiting() == 4 ? "都到齐了,继续走吧" : "正在等待"));
cb.await();
} catch (Exception e) {
e.printStackTrace();
}
}
};
service.execute(runnable);
}
service.shutdown();
}
}
打印结果:
线程pool-1-thread-4即将到达集合地点1,当前已有1已经到达,正在等待
线程pool-1-thread-5即将到达集合地点1,当前已有2已经到达,正在等待
线程pool-1-thread-1即将到达集合地点1,当前已有3已经到达,正在等待
线程pool-1-thread-3即将到达集合地点1,当前已有1已经到达,正在等待
线程pool-1-thread-2即将到达集合地点1,当前已有1已经到达,正在等待
线程pool-1-thread-2即将到达集合地点2,当前已有1已经到达,正在等待
线程pool-1-thread-3即将到达集合地点2,当前已有2已经到达,正在等待
线程pool-1-thread-4即将到达集合地点2,当前已有3已经到达,正在等待
线程pool-1-thread-5即将到达集合地点2,当前已有4已经到达,正在等待
线程pool-1-thread-1即将到达集合地点2,当前已有5已经到达,都到齐了,继续走吧
线程pool-1-thread-2即将到达集合地点3,当前已有1已经到达,正在等待
线程pool-1-thread-5即将到达集合地点3,当前已有1已经到达,正在等待
线程pool-1-thread-4即将到达集合地点3,当前已有1已经到达,正在等待
线程pool-1-thread-1即将到达集合地点3,当前已有1已经到达,正在等待
线程pool-1-thread-3即将到达集合地点3,当前已有4已经到达,都到齐了,继续走吧
我把run方法改为public synchronized void run() 则正确了,为什么???这种做法正确吗?
作者:
霍振鹏
时间:
2014-3-27 22:05
程序没错,,,不过我感觉synchronized不能加,加也没用,,,,他们各自操作各自的run方法,我感觉这样写比较好
package aaaa;
import java.util.Random;
import java.util.concurrent.CyclicBarrier;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class CyclicBarrierTest {
public static void main(String[] args) {
ExecutorService service = Executors.newCachedThreadPool();
final CyclicBarrier cb = new CyclicBarrier(5);
for(int i = 0; i < 5; i++) {
Runnable runnable = new Runnable() {
@Override
public void run() {
try {
Thread.sleep(new Random().nextInt(1000));
//为什么cb.getNumberWaiting()方法得到等待的线程的数据不正确呢????
System.out.println("线程" + Thread.currentThread().getName() + "即将到达集合地点1,当前已有" + (cb.getNumberWaiting() ) + "已经到达," + (cb.getNumberWaiting() == 4 ? "都到齐了,继续走吧" : "正在等待"));
cb.await();
Thread.sleep(new Random().nextInt(1000));
System.out.println("线程" + Thread.currentThread().getName() + "即将到达集合地点2,当前已有" + (cb.getNumberWaiting() ) + "已经到达," + (cb.getNumberWaiting() == 4 ? "都到齐了,继续走吧" : "正在等待"));
cb.await();
Thread.sleep(new Random().nextInt(1000));
System.out.println("线程" + Thread.currentThread().getName() + "即将到达集合地点3,当前已有" + (cb.getNumberWaiting() ) + "已经到达," + (cb.getNumberWaiting() == 4 ? "都到齐了,继续走吧" : "正在等待"));
cb.await();
} catch (Exception e) {
e.printStackTrace();
}
}
};
service.execute(runnable);
}
service.shutdown();
}
}
复制代码
屡试不爽
a.png
(10.2 KB, 下载次数: 10)
下载附件
2014-3-27 22:04 上传
作者:
王竞
时间:
2014-4-3 22:45
哦,这样啊,谢谢
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2