JUC

256 阅读1分钟

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

目的:

用于多个共享资源的互斥使用;
并与并发线程数的控制。