JUC 并发编程

JUC常用辅助类

CountDownLatch

可以记录一个数,调用countDown()数字减1,当数字为0的时候,会通知所有调用await()的线程放行。

  • 需求:5个线程全部执行完毕,main线程才结束:
package vc.coding.juc;

import java.util.concurrent.CountDownLatch;

/**
* 需求:5个线程全部执行完毕,main线程才结束
*
* @author HeTongHao
* @since 2020/3/8 15:36
*/
public class CountDownLatchDemo {
public static void main(String[] args) throws InterruptedException {
CountDownLatch countDownLatch = new CountDownLatch(5);
for (int i = 1; i <= 5; i++) {
new Thread(() -> {
System.out.println("线程" + Thread.currentThread().getName() + "启动");
countDownLatch.countDown();
}, String.valueOf(i)).start();
}
countDownLatch.await();
System.out.println(Thread.currentThread().getName() + "线程完毕");
}
}

执行结果

CyclicBarrier

作用与CountDownLatch相反,同样可以记录一个数,当调用await()的线程数等于这个数时,才执行执行指定的操作。

  • 需求:集齐七颗龙珠后立即召唤神龙:
package vc.coding.juc;

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

/**
* 需求:集齐七颗龙珠后立即召唤神龙
*
* @author HeTongHao
* @since 2020/3/8 15:51
*/
public class CyclicBarrierDemo {
public static void main(String[] args) {
CyclicBarrier cyclicBarrier = new CyclicBarrier(5, () -> {
System.out.println("召唤神龙!");
});
for (int i = 1; i <= 7; i++) {
final int tempI = i;
new Thread(() -> {
try {
System.out.println(Thread.currentThread().getName() + "收集了第" + tempI + "颗龙珠");
cyclicBarrier.await();
} catch (InterruptedException | BrokenBarrierException e) {
e.printStackTrace();
}
}, String.valueOf(i)).start();
}
}
}

执行结果

Semaphore

指定一个信号量。

每次调用acquire()的时候信号量-1,当信号量为0时,就会一直等待,直到信号量不为0。

每次调用release()的时候信号量+1。

  • 需求:一段代码同时只能被3个线程执行:
package vc.coding.juc;

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.concurrent.Semaphore;
import java.util.concurrent.TimeUnit;

/**
* 需求,一段代码同时只能被3个线程执行
*
* @author HeTongHao
* @since 2020/3/8 16:09
*/
public class SemaphoreDemo {
static DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("mm分ss秒");

public static void main(String[] args) {
Semaphore semaphore = new Semaphore(3);
for (int i = 1; i <= 7; i++) {
new Thread(() -> {
try {
semaphore.acquire();
System.out.println(Thread.currentThread().getName() + "线程抢到了执行权限" + dateTimeFormatter.format(LocalDateTime.now()));
//使用三秒执行权限
TimeUnit.SECONDS.sleep(3);
System.out.println(Thread.currentThread().getName() + "线程释放了执行权限");
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
semaphore.release();
}
}, String.valueOf(i)).start();
}
}
}

执行结果

测试单例模式不加valitale为什么会不完全

怎么解决死锁

文章作者: 何同昊
文章链接: http://hetonghao.cn/2020/03/Juc并发编程/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 何同昊 Blog
支付宝超级火箭🚀
微信超级火箭🚀