并发的三个工具类

简介: 并发的三个工具类

1、CountDownLatch

计数器

package com.juc.ofok.demo;
import java.util.concurrent.CountDownLatch;
/**
 * 代码源于生活,高于生活
 *
 * @author ofok
 * @date 2020-04-19 18:45:33
 */
public class CountDownLatchDemo {
    /**
     *  有些任务是不得不阻塞的, 减法计数器
     */
    public static void main(String[] args) throws InterruptedException {
        CountDownLatch countDownLatch = new CountDownLatch(6);
        for (int i = 0; i <= countDownLatch.getCount(); i++) {
            new Thread(() -> {
                System.out.println(Thread.currentThread().getName() + " start ");
                // 出去一个人计数器就减 -1
                countDownLatch.countDown();
            }, String.valueOf(i)).start();
        }
        // 阻塞等待计数器归零
        countDownLatch.await();
        // 阻塞的操作:计数器 num++
        System.out.println(Thread.currentThread().getName() + " === END ");
    }
    /**
     *  结果诡异的嘛?达不到预期的 Main end 在最后一个
     */
    public static void test1() {
        for (int i = 1; i <= 6; i++) {
            new Thread(()->{
                System.out.println(Thread.currentThread().getName()+" start ");
            }, String.valueOf(i)).start();
        }
        System.out.println(Thread.currentThread().getName() + " End ");
    }
}

CountDownLatch countDownLatch = new CountDownLatch(6);

countDownLatch.countDown(); 出去一个人计数器就 -1

countDownLatch.await(); 阻塞等待计数器归零

2、CyclicBarrier 回环栅栏 计数器加法

package com.ofok.juc.demo;
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;
/**
 * 代码源于生活,高于生活
 * 回环栅栏 计数器加法
 *
 * @author ofok
 * @date 2020-04-19 18:45:33
 */
public class CyclicBarrierDemo {
    public static void main(String[] args) {
        // 集齐7个龙珠召唤神龙 ++ 1//
        // 等待cyclicBarrier计数器满,就执行后面的Runnable,不满就阻塞
        CyclicBarrier cyclicBarrier = new CyclicBarrier(7, new Runnable() {
            @Override
            public void run() {
                System.out.println("神龙召唤成功!");
            }
        });
        for (int i = 1; i <= 7; i++) {
            final int temp = i;
            new Thread(() -> {
                System.out.println(Thread.currentThread().getName() + "收集了第" + temp + "颗龙珠");
                try {
                    cyclicBarrier.await();
                    // 等待 阻塞
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } catch (BrokenBarrierException e) {
                    e.printStackTrace();
                }
            }, String.valueOf(i)).start();
        }
    }
}

3、信号量(信号灯)

package com.ofok.juc.demo;
import java.util.concurrent.Semaphore;
import java.util.concurrent.TimeUnit;
/**
 * 代码源于生活,高于生活
 * 信号量(信号灯) 抢车位
 *
 * @author ofok
 * @date 2020-04-19 18:45:33
 */
public class SemaphoreDemo {
    public static void main(String[] args) {
        // 模拟6个车,只有3个车位
        // 3个位置
        Semaphore semaphore = new Semaphore(3);
        for (int i = 1; i <= 6; i++) {
            new Thread(() -> {
                // 得到车位
                try {
                    semaphore.acquire(); // 得到
                    System.out.println(Thread.currentThread().getName() + "抢到了车位");
                    TimeUnit.SECONDS.sleep(3);
                    System.out.println(Thread.currentThread().getName() + "离开了车位");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } finally {
                    // 释放位置
                    semaphore.release();
                }
            }, String.valueOf(i)).start();
        }
    }
}
目录
相关文章
|
6月前
|
缓存
【工具篇】使用concurrentHashMap实现缓存工具类
【工具篇】使用concurrentHashMap实现缓存工具类
|
6月前
|
Java
java 并发、线程池
java 并发、线程池
40 0
|
4月前
|
安全 Java 开发者
Java中的并发工具类与线程安全实现
Java中的并发工具类与线程安全实现
|
6月前
|
缓存 安全 Java
Java的线程池与并发工具类技术性文章
Java的线程池与并发工具类技术性文章
31 0
|
6月前
|
安全 Java
深入理解 Java 多线程和并发工具类
【4月更文挑战第19天】本文探讨了Java多线程和并发工具类在实现高性能应用程序中的关键作用。通过继承`Thread`或实现`Runnable`创建线程,利用`Executors`管理线程池,以及使用`Semaphore`、`CountDownLatch`和`CyclicBarrier`进行线程同步。保证线程安全、实现线程协作和性能调优(如设置线程池大小、避免不必要同步)是重要环节。理解并恰当运用这些工具能提升程序效率和可靠性。
136 0
|
分布式计算 测试技术 开发者
JUC基础(五)—— 并发工具类
JUC基础(五)—— 并发工具类
117 0
|
6月前
|
安全 Java 调度
【多线程】Java如何实现多线程?如何保证线程安全?如何自定义线程池?
【多线程】Java如何实现多线程?如何保证线程安全?如何自定义线程池?
265 0
|
设计模式 缓存 Java
【Java|多线程与高并发】线程池详解
Java线程池是一种用于管理和重用线程的机制,它可以在需要执行任务时,从线程池中获取线程,执行任务,然后将线程放回池中,以便后续使用。线程池可以有效地管理线程的数量,提高程序的性能和资源利用率。
【Java|多线程与高并发】线程池详解
|
存储 Java API
使用Java中的线程池提高性能和并发控制
在Java编程中,处理并发任务是一个常见且具有挑战性的任务。为了有效地管理线程和提高性能,Java提供了线程池的概念和相应的API。
106 0
|
存储 监控 Java
Java-线程池解决并发问题
Java-线程池解决并发问题
127 0