JUC(一)

JUC(一)

引言

这篇文章是JUC分类的第一篇文章,我希望大家能够掌握这部分的知识,我们一起来学习吧!

1.学习前需要的知识

1.1 JUC是什么?

JUC是java.util.concurrent包的简称,在Java5.0添加,目的就是为了更好的支持高并发任务。让开发者进行多线程编程时减少竞争条件和死锁的问题!

1.2 进程与线程的区别:

进程 : 一个运行中的程序的集合; 一个进程往往可以包含多个线程,至少包含一个线程

java默认有几个线程? 两个 main线程 gc线程

线程 : 线程(thread)是操作系统能够进行运算调度的最小单位。

1.3 并发与并行的区别:

并发(多线程操作同一个资源,交替执行)

CPU一核, 模拟出来多条线程,天下武功,唯快不破,快速交替

并行(多个人一起行走, 同时进行)

CPU多核,多个线程同时进行 ; 使用线程池操作

1.4 线程的六个状态:

public enum State {

// 新生

NEW,

// 运行

RUNNABLE,

// 阻塞

BLOCKED,

// 等待

WAITING,

//超时等待

TIMED_WAITING,

//终止

TERMINATED;

}

1.5 wait/sleep的区别:

来自不同的类:​ wait来自object类, sleep来自线程类

关于锁的释放:wait会释放锁, sleep不会释放锁

使用的范围不同: wait必须在同步代码块中, sleep可以在任何地方睡眠

2.JUC的结构

1.tools(工具类)

1)CountDownLatch(闭锁) 是一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待

2)CyclicBarrier(栅栏) 之所以叫barrier,是因为是一个同步辅助类,允许一组线程互相等待,直到到达某个公共屏障点 ,并且在释放等待线程后可以重用。

3)Semaphore(信号量) 是一个计数信号量,它的本质是一个“共享锁“。信号量维护了一个信号量许可集。线程可以通过调用 acquire()来获取信号量的许可;当信号量中有可用的许可时,线程能获取该许可;否则线程必须等待,直到有可用的许可为止。 线程可以通过release()来释放它所持有的信号量许可。

2.executor(执行者)

是Java里面线程池的顶级接口,但它只是一个执行线程的工具,真正的线程池接口是ExecutorService,里面包含的类有:

1)ScheduledExecutorService 解决那些需要任务重复执行的问题

2)ScheduledThreadPoolExecutor 周期性任务调度的类实现

LICENSED UNDER CC BY-NC-SA 4.0