实现多个线程同步一般有三种方式(CountDownLatch,CyclicBarrier,Semaphore)
1:CountDownLatch一般用于一个线程等待其他多个线程的同步。其countDown方法将计数器减1。await方法在计数器不为0的时候都是阻塞状态(await不改变计数器的值)。 2:CyclicBarrier的await将计数器值加1,其值不为构造器中的参数的时候是阻塞的。而且CyclicBarrier还可以重复利用。等到计数器为0的时候开始执行。 3: Semaphore(信号量)是实现多线程的资源共享。
看CountDownLatch的例子:
package demo; import java.util.concurrent.CountDownLatch; public class Main { public static void main(String[] args) { CountDownLatch countDownLatch=new CountDownLatch(5); for(int i=0;i<5;i++){ new Thread(new r(countDownLatch)).start(); } try { countDownLatch.await(); System.out.println("主线程可以执行了"); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } //CountDownLatch实现同步 class r implements Runnable{ private CountDownLatch countDownLatch; public r(CountDownLatch countDownLatch){ this.countDownLatch=countDownLatch; } @Override public void run() { System.out.println("进程 "+Thread.currentThread().getName()+"正在执行"); try { Thread.sleep(3000); System.out.println("进程 "+Thread.currentThread().getName()+"执行完"); countDownLatch.countDown(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
结果
i
以上是主线程等到其它5个线程都执行完成了,然后再执行。
接下来看CyclicBarrier(回环删栏)。其await方法将计数器加1,在计数器的值不是构造参数中的值的时候是阻塞状态。等到计数器为10开始执行。可以等待多个线程达到同一状态然后进行后面的任务。下面直接看例子:
public class Main { public static void main(String[] args) { CyclicBarrier cyclicBarrier=new CyclicBarrier(5); for(int i=0;i<5;i++){ new Thread(new r_Cyclic(cyclicBarrier)).start(); } } } //CyclicBarrier实现同步 class r_Cyclic implements Runnable{ private CyclicBarrier cyclicBarrier; public r_Cyclic(CyclicBarrier cyclicBarrier) { this.cyclicBarrier=cyclicBarrier; } @Override public void run() { System.out.println("进程" +Thread.currentThread().getName()+"开始执行"); try { Thread.sleep(2000); System.out.println("进程" +Thread.currentThread().getName()+"开始等待"); cyclicBarrier.await(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println("进程" +Thread.currentThread().getName()+"执行完"); } }
结果
接下来看Semaphore(信号量)。。有8个任务,但是只有5个资源
public class Main { public static void main(String[] args) { Semaphore semaphore=new Semaphore(5); //8个任务,但是只有5个资源 for(int i=0;i<8;i++){ new Thread(new r_sema(semaphore)).start(); } } } //Semaphore(信号量)实现资源共享 class r_sema implements Runnable{ private Semaphore semaphore; public r_sema(Semaphore semaphore) { this.semaphore=semaphore; } @Override public void run() { // TODO Auto-generated method stub try { //获得一个许可 semaphore.acquire(); System.out.println("进程 "+Thread.currentThread().getName()+"正在执行任务"); Thread.sleep(4000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println("进程 "+Thread.currentThread().getName()+"释放一个许可"); //释放一个许可 semaphore.release(); } }
结果
欢迎与广大 coder 交流技术
QQ:1228935432
WX:WX1228935432
来源:https://www.cnblogs.com/pin-wang/p/5822628.html