写点什么

控制并发线程数的 Semaphore

作者:周杰伦本人
  • 2022 年 6 月 08 日
  • 本文字数:1469 字

    阅读完需:约 5 分钟

控制并发线程数的 Semaphore

Semaphore(信号量)是用来控制同时访问特定资源的线程数量,它通过协调各个线程,以保证合理的使用公共资源。


public class SemaphoreTest {    private static final int THREAD_COUNT = 30;    private static ExecutorService threadPool = Executors            .newFixedThreadPool(THREAD_COUNT);    private static Semaphore s = new Semaphore(10);
public static void main(String[] args) { for (int i = 0; i < THREAD_COUNT; i++) { threadPool.execute(new Runnable() { @Override public void run() { try { s.acquire(); System.out.println("save data"); s.release(); } catch (InterruptedException e) { } } }); } threadPool.shutdown(); }}
复制代码


Semaphore 的用法也很简单,首先线程使用 Semaphore 的 acquire()方法获取一个许可证,使用完之后调用 release()方法归还许可证。还可以用 tryAcquire()方法尝试获取许可证。

线程间交换数据的 Exchanger

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


如果两个线程有一个没有执行 exchange()方法,则会一直等待,如果担心有特殊情况发生,避免一直等待,可以使用 exchange(V x,longtimeout,TimeUnit unit)设置最大等待时长。


Exchanger 可以用于遗传算法,遗传算法里需要选出两个人作为交配对象,这时候会交换两人的数据,并使用交叉规则得出 2 个交配结果。Exchanger 也可以用于校对工作,比如我们需要将纸制银行流水通过人工的方式录入成电子银行流水,为了避免错误,采用 AB 岗两人进行录入,录入到 Excel 之后,系统需要加载这两个 Excel,并对两个 Excel 数据进行校对,看看是否录入一致


public class ExchangerTest {    private static final Exchanger<String> exgr = new Exchanger<String>();    private static ExecutorService threadPool = Executors.newFixedThreadPool(2);    public static void main(String[] args) {        threadPool.execute(new Runnable() {            @Override            public void run() {                try {                    String A = "银行流水A"; // A录入银行流水数据                    exgr.exchange(A);                } catch (InterruptedException e) {                }            }        });        threadPool.execute(new Runnable() {            @Override            public void run() {                try {                    String B = "银行流水B"; // B录入银行流水数据                    String A = exgr.exchange("B");                    System.out.println("A和B数据是否一致:" + A.equals(B) + ",A录入的是:"+ A + ",B录入是:" + B);                } catch (InterruptedException e) {                }            }        });        threadPool.shutdown();    }}
复制代码


发布于: 刚刚阅读数: 4
用户头像

还未添加个人签名 2020.02.29 加入

还未添加个人简介

评论

发布
暂无评论
控制并发线程数的Semaphore_6月月更_周杰伦本人_InfoQ写作社区