1. 什么是juc
1.1 juc简介
JUC就是 java.util .concurrent 工具包的简称
1.2 线程
线程状态:
NEW,(新建), RUNNABLE(就绪), BLOCKED(阻塞), WAITING(不见不散),
TIMED_WAITING(过时不候), TERMINATED(终结)。
wait/sleep 的区别
sleep是Thread的静态方法;wait是Object的方法,任何对象都可以调用。
sleep 不会释放锁,它也不需要占用锁。wait 会释放锁,但调用它的前提是当前线程占有锁(即代码要在 synchronized 中)。
它们都可以被 interrupted 方法打断。
1.3 并发与并行
并发:同一时刻多个线程在访问同一个资源,多个线程对一个点
例子:春运抢票 电商秒杀...
并行:多项工作一起执行,之后再汇总
例子:泡方便面,电水壶烧水,一边撕调料倒入桶中
1.4 用户线程 与 守护线程
用户线程:平时用到的普通线程,自定义线程
守护线程:运行在后台,是一种特殊的线程,比如垃圾回收
当主线程结束后,用户线程还在运行,JVM 存活
如果没有用户线程,都是守护线程,JVM 结束
2.2 常用类
CountDownLatch
public class CountDownLatchDemo {
public static void main(String[] args) throws InterruptedException {
CountDownLatch countDownLatch = new CountDownLatch(7);
for (int i = 0; i < 7; i++) {
new Thread(() -> {
System.out.println(Thread.currentThread().getName() + "leave");
//当已经为0的时候,调用countDown()方法也不会报错
countDownLatch.countDown();
}, i + "").start();
}
countDownLatch.await();
System.out.println(Thread.currentThread().getName() + "finish");
}
}
CyclicBarrier
public class CyclicBarrierDemo {
public static void main(String[] args) {
CyclicBarrier cyclicBarrier = new CyclicBarrier(7, () -> {
System.out.println("完成,结束!!!!");
});
for (int i = 0; i < 7; i++) {
new Thread(() -> {
System.out.println(Thread.currentThread().getName() + "come in");
try {
cyclicBarrier.await();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (BrokenBarrierException e) {
e.printStackTrace();
}
}, i + "").start();
}
}
}
Semaphore
目的:
用于多个共享资源的互斥使用;
并与并发线程数的控制。