启动N个线程并使之进入wait()状态,然后同时notifyAll()所有线程执行任务
注意:
- wait()和notifyAll()需要使用synchronized块包裹,防止被线程并发调用
- 需要一个全局锁来控制等待和唤醒
- notify()只唤醒wait()中的一个线程,notifyAll()一次性唤醒所有线程
package cywen.demo;
public class Demo{
public static void main(String[] args) {
for (int i=0; i<100; i++) {
Thread thread = new MyThread();
thread.start();
}
try {
Thread.sleep(3000);
synchronized (MyThread.lock) {
// MyThread.lock.notify();
MyThread.lock.notifyAll();
}
Thread.sleep(3000);
} catch (Exception e){
e.printStackTrace();
}
}
}
class MyThread extends Thread {
static final Object lock = new byte[0];
@Override
public void run(){
try {
System.out.println(Thread.currentThread().getName()+" startup.");
synchronized (lock) {
lock.wait();
}
System.out.println(Thread.currentThread().getName()+" > "+System.currentTimeMillis());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
循环栅栏的用途,就是指定一个线上数量,当调用await()的次数达到设置的值,就会一次性执行所有的线程
可以看看Java之CyclicBarrier使用的文章介绍
package cywen.demo;
import java.util.concurrent.*;
public class Demo {
static CyclicBarrier cyclicBarrier = new CyclicBarrier(100);
public static void main(String[] args) {
ExecutorService executorService = Executors.newFixedThreadPool(100);
for (int i=0; i<100; i++) {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
executorService.submit(new MyThread());
}
executorService.shutdown();
}
}
class MyThread extends Thread {
@Override
public void run() {
System.out.println(Thread.currentThread().getName()+" startup");
try {
Constants.cyclicBarrier.await();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (BrokenBarrierException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+" go");
}
}