java 多线程并发JUC编程详解

基础概念

在学习之前我们应该先弄清几个概念:进程,线程,任务和执行器,由于我没读过专业的书籍只能根据我的理解简单介绍一下,但入门也足够了
进程
进程就是应用程序,一个应用程序就是一个进程
打开任务管理器可以看到
java 多线程并发JUC编程详解_第1张图片
线程
线程就是一个进程里通向cpu的线路,以我们电脑管家为例,可以同时进行优化,垃圾清理等等,但是有时候它会显示安全监测不能和垃圾清理同时进行,就说明这个进程的线程用完了。在程序运行时即使我们没有创建线程也会有线程存在,比如main(主)线程、垃圾回收线程。
在这里插入图片描述
任务
任务就是在线程中执行的任务
调度器
在一个进程中。如果开辟了多个线程,线程的运行调度器安排调度,调度器是与操作系统紧密相关的,先后顺序是不能认为干预的
调度器就是自动管理线程的工具,不用我们亲自建立关闭线程

java多线程

在java中万物皆对象,以上所述也不例外,进程就是一个java程序,线程用Thread实现,任务用Runnable类实现,执行器用Executor类实现,我们只要掌握了这几个类就算是入门了

线程创建方式

继承Thread类
1、继承Thread类
2、重写run()方法
3、创建对象调用start()方法
实现Runnable接口
1、实现Runnable接口
2、重写run()方法
3、创建thread对象调用start()方法

线程状态

NEW新生状态
线程创建完成就进入了新生状态
就绪状态
当调用start方法时就进入了就绪状态,但不意味着立即执行
RUNNABLE运行状态
线程真正执行代码块,运行有两种结果一个就是阻塞另一个就是终止
BLOCKED阻塞状态
当调用sleep、join、wait或同步锁时,线程就进入了阻塞状态,就是代码不往下执行,阻塞事件解除后,重新进入就绪状态
TERMINATED 终止状态
线程中断或结束,一旦进入死亡状态就不能再次开启或执行
WAITING
正在等待另一个线程执行特定动作的线程处于此状态。
TIMED_WAITING
正在等待另一个线程执行动作达到指定等待时间的线程处于此状态。
获取线程状态
Thread.State getState()返回此线程的状态。

线程优先级

static int MAX_PRIORITY
最高(10)
static int MIN_PRIORITY
最低(1)
static int NORM_PRIORITY
默认(5)
设置获取线程优先级
优先级请在run方法中设置,优先级高的不一定先执行
int getPriority()
void setPriority(int newPriority)

启动线程

public void start() :导致此线程开始执行;Java虚拟机调用此线程的run方法。

线程睡眠

public static void sleep(long millis) :使当前正在执行的线程以指定的毫秒数暂停(暂时停止执行)
每个线程都有一把锁sleep不会释放锁

获取线程引用

public static Thread currentThread():返回对当前正在执行的线程对象的引用

线程插队

让当前线程先执行,其他线程处于阻塞状态
void join()

线程礼让

让当前线程停止转为就绪状态但是不阻塞,礼让不一定成功。
static void yield()

后台线程

虚拟机只需等待用户线程结束之后就关闭程序,不用等着后台线程结束
void setDaemon(boolean on)
boolean isDaemon()

线程中断

自己设置中断标志停止线程

判断线程是否正在活动

boolean isAlive()

线程同步

synchronized

当一个线程获得对象的排它锁,独占资源,其他线程必须等待,使用完成释放锁。
同步方法
默认锁住this
同步块
synchronized(Object obj)
{}
static方法
默认锁住Class

线程协作

void wait()
导致当前线程等待,直到另一个线程调用该对象的 notify()方法或 notifyAll()方法。
void wait(long timeout)
导致当前线程等待,直到另一个线程调用 notify()方法或该对象的 notifyAll()方法,或者指定的时间已过。
void notify()
唤醒正在等待对象监视器的单个线程。
void notifyAll()
唤醒正在等待对象监视器的所有线程。

集合类线程安全问题

解决集合类线程不安全问题方法就是使用collections的静态方法创建集合

static List< T> synchronizedList(List< T> list)
返回由指定列表支持的同步(线程安全)列表。
static Map synchronizedMap(Map m)
返回由指定地图支持的同步(线程安全)映射。
static < T> Set synchronizedSet(Set< T> s)
返回由指定集合支持的同步(线程安全)集。

JUC

什么是JUC

就是三个工具包,其中的工具就是java多线程的强化版
在这里插入图片描述

创建线程强化

Callable

他与runnable的最大区别就是他可以有返回值并且可以抛出异常
1、实现callable接口
2、重写call()方法
3、new FutureTask(Callable callable) 进行衔接
4、创建thread对象调用start()方法
获取返回值
Futrue.get()
1、结果会被缓存
2、可能会有阻塞

线程池

ExecutorService

void execute(Runnable command)
执行任务,没有返回值
< T>Future< T> submit(Callable command)
执行任务有返回值
void shutdown()
关闭线程池

Executors

线程池的工具类,用于创建并返回不同类型的线程池
static ExecutorService newSingleThreadExecutor()
创建一个单个线程
static ExecutorService newFixedThreadPool(int nThreads)
床加一个固定大小的线程池
static ScheduledExecutorService newScheduledThreadPool(int corePoolSize)
创建一个可伸缩的线程池

线程同步强化(Lock)

只要有synchronized那么效率就会低

ReentrantLock 类

void lock() 获得锁。
void unlock() 尝试释放此锁。
boolean tryLock()只有在调用时它不被另一个线程占用才能获取锁。
Condition newCondition() 返回Condition用于这种用途实例Lock实例。

ReadWriteLock读写锁

A ReadWriteLock维护一对关联的locks ,一个用于只读操作,一个用于写入。 read lock可以由多个阅读器线程同时进行,只要没有作者。 write lock是独家的。

线程协作强化(Condition)

可以定义多个Condition分别监视
void await()
导致当前线程等到发信号或 interrupted 。
void signal()
唤醒一个等待线程。

线程睡眠强化(TimeUnit)

DAYS
时间单位代表二十四小时
HOURS
时间单位代表六十分钟
MICROSECONDS
时间单位代表千分之一毫秒
MILLISECONDS
时间单位为千分之一秒
MINUTES
时间单位代表60秒
NANOSECONDS
时间单位代表千分之一千分之一
SECONDS
时间单位代表一秒

void sleep(long timeout)
使用此时间单位执行 Thread.sleep 。

线程插队强化(TimeUnit)

void timedJoin(Thread thread, long timeout)
使用此时间单位执行定时 Thread.join 。

集合类线程安全问题强化

CopyOnWriteArraySet< E>类
CopyOnWriteArraySet< E>类
ConcurrentHashMap< K,V>类

常用辅助类

CountDownLatch

线程减法计数器
void countDown()
减少锁存器的计数,如果计数达到零,释放所有等待的线程。
void await()
等待计数器归零,然后再向下执行

CyclicBarrier

线程加法计数器
CyclicBarrier(int parties, Runnable barrierAction)
创建一个新的 CyclicBarrier ,当给定数量的线程(线程)等待时,它将跳闸,当屏障跳闸时执行给定的屏障动作,由最后一个进入屏障的线程执行。
int await()
等待所有 parties已经在这个障碍上调用了 await 。

Semaphore

信号量
java 多线程并发JUC编程详解_第2张图片

你可能感兴趣的:(java)