Java多线程、线程池及线程同步(synchronized关键字、悲观锁、乐观锁)

1.进程与线程定义

进程包含线程,如一个百度网盘进程,该进程的线程可以有上传,下载。

Java多线程、线程池及线程同步(synchronized关键字、悲观锁、乐观锁)_第1张图片

Java多线程、线程池及线程同步(synchronized关键字、悲观锁、乐观锁)_第2张图片

Java多线程、线程池及线程同步(synchronized关键字、悲观锁、乐观锁)_第3张图片

Java多线程、线程池及线程同步(synchronized关键字、悲观锁、乐观锁)_第4张图片

2.创建线程的三种方式

方式1-继承Thread类

Java多线程、线程池及线程同步(synchronized关键字、悲观锁、乐观锁)_第5张图片

Java多线程、线程池及线程同步(synchronized关键字、悲观锁、乐观锁)_第6张图片

方式2-实现Runnabled接口

Java多线程、线程池及线程同步(synchronized关键字、悲观锁、乐观锁)_第7张图片

1.常规写法

Java多线程、线程池及线程同步(synchronized关键字、悲观锁、乐观锁)_第8张图片

Java多线程、线程池及线程同步(synchronized关键字、悲观锁、乐观锁)_第9张图片

2.匿名内部类写法

Java多线程、线程池及线程同步(synchronized关键字、悲观锁、乐观锁)_第10张图片

方式3-实现Callable接口

Java多线程、线程池及线程同步(synchronized关键字、悲观锁、乐观锁)_第11张图片

Java多线程、线程池及线程同步(synchronized关键字、悲观锁、乐观锁)_第12张图片

Java多线程、线程池及线程同步(synchronized关键字、悲观锁、乐观锁)_第13张图片

示例代码:

Java多线程、线程池及线程同步(synchronized关键字、悲观锁、乐观锁)_第14张图片

f1.get()方法得到call方法的返回值

Java多线程、线程池及线程同步(synchronized关键字、悲观锁、乐观锁)_第15张图片

也就是说当线程执行完后,get()方法才执行,这样才能得到线程执行完后的返回值。

3.Thread的常用方法

Java多线程、线程池及线程同步(synchronized关键字、悲观锁、乐观锁)_第16张图片

示例代码:

1.getName()方法获取线程名称

Java多线程、线程池及线程同步(synchronized关键字、悲观锁、乐观锁)_第17张图片

2.setName(字符串)方法为线程取名

image-20231207210925649

3.构造器super(name)方法为线程取名

Java多线程、线程池及线程同步(synchronized关键字、悲观锁、乐观锁)_第18张图片

4.sleep(毫秒值)线程睡眠

Java多线程、线程池及线程同步(synchronized关键字、悲观锁、乐观锁)_第19张图片

5.join()让当前该线程先执行完,其他线程再执行

Java多线程、线程池及线程同步(synchronized关键字、悲观锁、乐观锁)_第20张图片

Java多线程、线程池及线程同步(synchronized关键字、悲观锁、乐观锁)_第21张图片


4.认识线程安全

Java多线程、线程池及线程同步(synchronized关键字、悲观锁、乐观锁)_第22张图片

Java多线程、线程池及线程同步(synchronized关键字、悲观锁、乐观锁)_第23张图片

5.线程同步(解决线程安全问题)

1.同步代码块(synchronized)

Java多线程、线程池及线程同步(synchronized关键字、悲观锁、乐观锁)_第24张图片

Java多线程、线程池及线程同步(synchronized关键字、悲观锁、乐观锁)_第25张图片

1.对于静态方法,synchronized(类名.class)

Java多线程、线程池及线程同步(synchronized关键字、悲观锁、乐观锁)_第26张图片

2.对于示例方法,synchronized(this)

Java多线程、线程池及线程同步(synchronized关键字、悲观锁、乐观锁)_第27张图片

2.同步方法

Java多线程、线程池及线程同步(synchronized关键字、悲观锁、乐观锁)_第28张图片

Java多线程、线程池及线程同步(synchronized关键字、悲观锁、乐观锁)_第29张图片

synchronized不但可以修饰方法,还可以修饰成员变量、静态变量等。


同步代码块锁的范围更小,性能更好,因为需等待的范围小

Java多线程、线程池及线程同步(synchronized关键字、悲观锁、乐观锁)_第30张图片

3.Lock锁

Java多线程、线程池及线程同步(synchronized关键字、悲观锁、乐观锁)_第31张图片

1.创建锁对象,并多态写法,建议用final修饰

Java多线程、线程池及线程同步(synchronized关键字、悲观锁、乐观锁)_第32张图片

2.加锁和解锁,解锁一定要放在finally里,因为中间代码一旦出错,未解锁的话,该实例的其他线程会一直等待解锁

Java多线程、线程池及线程同步(synchronized关键字、悲观锁、乐观锁)_第33张图片

6.线程通信

wait()、notify()及notifyAll()方法。

Java多线程、线程池及线程同步(synchronized关键字、悲观锁、乐观锁)_第34张图片

Java多线程、线程池及线程同步(synchronized关键字、悲观锁、乐观锁)_第35张图片

Java多线程、线程池及线程同步(synchronized关键字、悲观锁、乐观锁)_第36张图片

示例代码:

Java多线程、线程池及线程同步(synchronized关键字、悲观锁、乐观锁)_第37张图片

Java多线程、线程池及线程同步(synchronized关键字、悲观锁、乐观锁)_第38张图片

Java多线程、线程池及线程同步(synchronized关键字、悲观锁、乐观锁)_第39张图片

7.线程池

定义

Java多线程、线程池及线程同步(synchronized关键字、悲观锁、乐观锁)_第40张图片

创建线程池

Java多线程、线程池及线程同步(synchronized关键字、悲观锁、乐观锁)_第41张图片

方式一

构造器参数描述

Java多线程、线程池及线程同步(synchronized关键字、悲观锁、乐观锁)_第42张图片

参数五任务队列可以是new ArrayBlockingQueue<>(n)表示n个缓存队列,new LinkedBlockingQueue<>()表示可以无限多个队列。任务队列是指线程排队的队列

参数六线程工程可以是Executors.defaultThreadFactory()表示使用默认的线程工程。

参数七任务拒绝策略如果是new ThreadPoolExecutor.AbortPolicy()表示抛异常进行处理。

Java多线程、线程池及线程同步(synchronized关键字、悲观锁、乐观锁)_第43张图片

Java多线程、线程池及线程同步(synchronized关键字、悲观锁、乐观锁)_第44张图片

注意事项

Java多线程、线程池及线程同步(synchronized关键字、悲观锁、乐观锁)_第45张图片

常用方法
1.线程池处理Runnable任务的方法

Java多线程、线程池及线程同步(synchronized关键字、悲观锁、乐观锁)_第46张图片

2.线程池处理Callable任务的方法

Java多线程、线程池及线程同步(synchronized关键字、悲观锁、乐观锁)_第47张图片

示例代码1:处理Runnable线程

Java多线程、线程池及线程同步(synchronized关键字、悲观锁、乐观锁)_第48张图片

线程池并没有死亡

Java多线程、线程池及线程同步(synchronized关键字、悲观锁、乐观锁)_第49张图片

线程池的关闭

image-20231207223204886

创建临时线程

Java多线程、线程池及线程同步(synchronized关键字、悲观锁、乐观锁)_第50张图片

都满了,执行任务策略

Java多线程、线程池及线程同步(synchronized关键字、悲观锁、乐观锁)_第51张图片

示例代码2:处理Callable线程

Java多线程、线程池及线程同步(synchronized关键字、悲观锁、乐观锁)_第52张图片

拒绝策略

Java多线程、线程池及线程同步(synchronized关键字、悲观锁、乐观锁)_第53张图片


方式二-Excutors工具类(创建的线程可定期执行任务)

Java多线程、线程池及线程同步(synchronized关键字、悲观锁、乐观锁)_第54张图片

pool就是线程池对象

Java多线程、线程池及线程同步(synchronized关键字、悲观锁、乐观锁)_第55张图片

注意事项:

Java多线程、线程池及线程同步(synchronized关键字、悲观锁、乐观锁)_第56张图片

Java多线程、线程池及线程同步(synchronized关键字、悲观锁、乐观锁)_第57张图片

8.并发与并行及线程的生命周期

Java多线程、线程池及线程同步(synchronized关键字、悲观锁、乐观锁)_第58张图片

Java多线程、线程池及线程同步(synchronized关键字、悲观锁、乐观锁)_第59张图片

并发的每次处理16个线程,所以说并发和并行同时进行的

Java多线程、线程池及线程同步(synchronized关键字、悲观锁、乐观锁)_第60张图片

Java多线程、线程池及线程同步(synchronized关键字、悲观锁、乐观锁)_第61张图片

Java多线程、线程池及线程同步(synchronized关键字、悲观锁、乐观锁)_第62张图片

sleep方法不会释放锁权限。

Java多线程、线程池及线程同步(synchronized关键字、悲观锁、乐观锁)_第63张图片


9.悲观锁、乐观锁

image-20231208124006594

悲观锁示例代码:

出现了线程安全问题

Java多线程、线程池及线程同步(synchronized关键字、悲观锁、乐观锁)_第64张图片

Java多线程、线程池及线程同步(synchronized关键字、悲观锁、乐观锁)_第65张图片

乐观锁示例代码:

Java多线程、线程池及线程同步(synchronized关键字、悲观锁、乐观锁)_第66张图片

你可能感兴趣的:(Java学习从0到1,java,开发语言)