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

发布时间:2023年12月25日

1.进程与线程定义

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

image-20231208121104691

image-20231207200805774

image-20231207200832796

image-20231207205002628

2.创建线程的三种方式

方式1-继承Thread类

image-20231207204839561

image-20231207204750807

方式2-实现Runnabled接口

image-20231207205315366

1.常规写法

image-20231207205252994

image-20231207205548256

2.匿名内部类写法

image-20231207205417435

方式3-实现Callable接口

image-20231207205638691

image-20231207205747187

image-20231207210349671

示例代码:

image-20231207210052881

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

image-20231207210146651

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

3.Thread的常用方法

image-20231207210613001

示例代码:

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

image-20231207210828069

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

image-20231207210925649

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

image-20231207211047525

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

image-20231207211156051

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

image-20231207211342582

image-20231207211616298


4.认识线程安全

image-20231207211700529

image-20231207211724786

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

1.同步代码块(synchronized)

image-20231207212108877

image-20231207212448431

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

image-20231207212509666

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

image-20231207214740211

2.同步方法

image-20231207215241122

image-20231207215358596

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


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

image-20231207215343964

3.Lock锁

image-20231207220238082

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

image-20231207215929023

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

image-20231207220017017

6.线程通信

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

image-20231207220343218

image-20231207220349546

image-20231207220559740

示例代码:

image-20231207220835718

image-20231207220909430

image-20231207220921225

7.线程池

定义

image-20231207221029904

创建线程池

image-20231207221230548

方式一

构造器参数描述

image-20231207221500450

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

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

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

image-20231207222455774

image-20231207222518758

注意事项

image-20231207222544827

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

image-20231207222744292

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

image-20231207223936256

示例代码1:处理Runnable线程

image-20231207222909880

线程池并没有死亡

image-20231207223023546

线程池的关闭

image-20231207223204886

创建临时线程

image-20231207223331386

都满了,执行任务策略

image-20231207223521541

示例代码2:处理Callable线程

image-20231207224433064

拒绝策略

image-20231207223807913


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

image-20231207224854067

pool就是线程池对象

image-20231207225149107

注意事项:

image-20231207225408429

image-20231207225334010

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

image-20231208121551228

image-20231208121610181

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

image-20231208121649428

image-20231208121936248

image-20231208122220369

sleep方法不会释放锁权限。

image-20231208122228191


9.悲观锁、乐观锁

image-20231208124006594

悲观锁示例代码:

出现了线程安全问题

image-20231208122812916

image-20231208123703869

乐观锁示例代码:

image-20231208124329614

文章来源:https://blog.csdn.net/qq_62614525/article/details/135187992
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。