美文网首页
并发工具类

并发工具类

作者: JBryan | 来源:发表于2020-02-01 15:11 被阅读0次
1.CountDownLatch

await(),进入等待的状态
countDown(),计数器减一
应用场景:启动三个线程计算,需要对结果进行累加。
CountDownLatch使用

package com.ljessie.sinopsis.util;

import java.util.concurrent.CountDownLatch;

/**
 * 等待所有线程都执行完毕之后,再执行
 * @author zbw
 *
 */
public class CountDownLatchDemo {

    public static void main(String[] args) {
        CountDownLatch countDownLatch = new CountDownLatch(8);
        //模拟裁判,等所有选手都完成比赛的情况下,才会继续进行
        new Thread() {
            public void run() {
                try {
                    countDownLatch.await();
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                System.out.println("800米比赛结束,清空跑道");
            }
        }.start();
        
        //模拟参赛运动员
        for (int i = 0; i < 8; i++) {
            int finalI = i;
            new Thread() {
                public void run() {
                    try {
                        Thread.sleep(finalI*1000);
                        System.out.println("到达终点:"+Thread.currentThread().getName());
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    } finally {
                        //选手完成比赛
                        countDownLatch.countDown();
                    }
                }
            }.start();
        }
    }
}
2.CyclicBarrier--栅栏

允许一组线程相互等待达到一个公共的障碍点,之后再继续执行
跟countDownLatch的区别
CountDownLatch一般用于某个线程等待若干个其他线程执行完任务之后,它才执行;不可重复使用​ CyclicBarrier一般用于一组线程互相等待至某个状态,然后这一组线程再同时执行;可重用的

package com.ljessie.sinopsis.util;

import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;

/**
 * 等所有线程都到达某一状态时,再一起执行
 * @author zbw
 *
 */
public class CyclicBarrierDemo {
    
    public static void main(String[] args) {
        CyclicBarrier barrier = new CyclicBarrier(8);
        for (int i = 0; i < 8; i++) {
            int finalI = i;
            new Thread(new Runnable() {
                
                @Override
                public void run() {
                    
                    try {
                        Thread.sleep(finalI * 1000);
                        System.out.println("准备就绪:"+Thread.currentThread().getName());
                        barrier.await();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    } catch (BrokenBarrierException e) {
                        e.printStackTrace();
                    }
                    System.out.println("起跑:"+Thread.currentThread().getName());
                }
            }).start();
            
        }
    }
}
3.Semaphore--信号量

控制并发数量
使用场景:接口限流

package com.ljessie.sinopsis.util;

import java.util.concurrent.Semaphore;

/**
 * 信号量,控制并发数量。
 * @author zbw
 *
 */
public class SemaphoreDemo {

    public static void main(String[] args) {
        Semaphore semaphore = new Semaphore(8);
        for (int i = 0; i < 10; i++) {
            new Thread(new Runnable() {
                
                @Override
                public void run() {
                    try {
                        semaphore.acquire();
                        System.out.println("开始执行:"+Thread.currentThread().getName());
                        Thread.sleep(5000); 
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    } finally {
                        //线程执行完毕,释放资源
                        semaphore.release();
                    }           
                }
            }).start();
        }
    }
}

4.Exchanger--用于交换数据

它提供一个同步点,在这个同步点两个线程可以交换彼此的数据。这两个线程通过exchange方法交换数据, 如果第一个线程先执行exchange方法,它会一直等待第二个线程也执行exchange,当两个线程都到达同步点时,这两个线程就可以交换数据,将本线程生产出来的数据传递给对方。因此使用Exchanger的重点是成对的线程使用exchange()方法,当有一对线程达到了同步点,就会进行交换数据。因此该工具类的线程对象是【成对】的。

package com.ljessie.sinopsis.util;

import java.util.concurrent.Exchanger;

/**
 * 用来交换数据的,两个线程通过exchange方法交换数据,如果第一个线程先
 * 执行exchange方法,它会一直等待第二个线程也执行exchange方法。
 * 将本线程生产的数据交换给对方。
 * @author zbw
 *
 */
public class ExchangerDemo {
    
    public static void main(String[] args) {
        Exchanger<String> exchanger = new Exchanger<String>();
        String str1 = "zbw";
        String str2 = "jessie";
        
        new Thread(new Runnable() {
            
            @Override
            public void run() {
                System.out.println(Thread.currentThread().getName()+"初始值------>"+str1);
                try {
                    String exchangeString = exchanger.exchange(str1);
                    System.out.println(Thread.currentThread().getName()+"交换后------>"+exchangeString);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }).start();
        new Thread(new Runnable() {     
            @Override
            public void run() {
                System.out.println(Thread.currentThread().getName()+"初始值------>"+str2);
                try {
                    Thread.sleep(2000);
                    String exchangeString = exchanger.exchange(str2);
                    System.out.println(Thread.currentThread().getName()+"交换后------>"+exchangeString);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }   
                        
            }
            }).start();
    }

}

相关文章

  • Java并发编程之工具类

    一、并发工具类 JDK1.5 引入常用并发工具类:CountDownLatch/Semaphore/CyclicB...

  • 高并发(9)- 线程并发工具类-CyclicBarrier

    @[TOC](高并发(9)- 线程并发工具类-CyclicBarrier) 前言 上篇文章讲解了线程的并发工具类之...

  • 高并发(10)- 线程并发工具类-Semaphore

    @[TOC](高并发(10)- 线程并发工具类-Semaphore) 前言 上篇文章讲解了线程的并发工具类之Cyc...

  • Java 并发包提供了哪些并发工具类

    Java 并发包提供了哪些并发工具类 Java 基础并发工具类 提供了比 synchronized更加高级的各种同...

  • Java并发编程-3

    目录(1)并发工具类(2)原子自增类(3)线程池 一:并发工具类 CountDownLatch:允许一个或多个线程...

  • 并发工具类 Semaphore

    上篇介绍了内部使用AQS的并发工具类CountDownLatch,接下来我要介绍的并发工具类Semaphore内部...

  • 并发工具类

    ------本文主要记录CountDownLatch,CyclicBarries、Semaphore工具提供的并发...

  • 并发工具类

    CountDownLatch 简介 CountDownLatch 允许一个或多个线程等待其他线程完成操作。 使用场...

  • 并发工具类

    1.CountDownLatch await(),进入等待的状态countDown(),计数器减一应用场景:启动三...

  • 并发工具类

    CountDownLatch 专业术语:在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。大白...

网友评论

      本文标题:并发工具类

      本文链接:https://www.haomeiwen.com/subject/iaztxhtx.html