课程链接:https://www.xuetangx.com/course/ncepu08091004439/8910836?channel=i.area.learn_title
- 第8章 多线程编程
- 8.1 多线程简介
- 8.2 创建线程的方式
- 线程创建的两种方法
- Thread类与Runnable接口的联系
- 8.3 线程控制
- 控制线程
- 线程控制的基本方法
- 1.sleep方法
- 2.interrupt方法
- 3.join方法
- 4.线程终止方法
- 8.4 线程的同步机制
- 同步的概念
- sychronized关键字
- 8.5 线程间的通信
- 等待/唤醒机制
- 1.wait方法
- 2.notify方法
- 生产者/消费者问题
- 8.6 Callable接口
- java.util.concurrent包(J.U.C并发包)简介
- Callable接口
- FutureTask类
- 异步处理
- 8.7 volatile关键字
一个进程可以拥有多个线程,这些线程可以共享为进程分配到内存和其他资源
进程之间不允许直接进行相互访问,智能通过系统提供的通信机制进行交互
定时等待与等待的区别:定时等待状态只要到了最大等待时间,即使等待的条件仍未满足,线程还是会自动醒来,自行返回
方法一:继承Thread类
方法二:实现Runnable接口
用继承Thread类的方法,Ticket类每个对象都有自己的Tickets成员,每个对象都有自己的10张票,每个线程都卖的是自己的拥有的10张票,所以实际上总共卖了30张票
因为只创建了一个BookTickets实例,因此Tickets成员也就是演出票只有一份
因此,实现Runnable接口的方式,可以满足多个线程处理统一数据资源的情况
sleep方法在此例中的作用:确定标签文本的刷新频率;在其休眠期间释放CPU资源
主线程的i大于1时,只能等待子线程全部执行完毕才能执行剩下的部分
增加休眠代码模拟现实情况,程序执行结果出现错误
同步的概念
一个临界资源可以对应多个临界区。
多个线程并发访问同一数据资源时需要进行同步处理
Java中,实现同步的方式有同步代码块及同步方法,使用synchronized关键字实现。
同步是以系统开销为代价的,因此同步控制并非越多越好,一方面,要避免无谓的同步控制,另一方面,要尽可能降低锁的粒度,仅对必要的代码块或者是需要保护的资源本身加锁。
wait和sleep方法都能使线程进入线程的限时等待状态,但wait方法在释放CPU资源的同时也交出了临界资源的控制权,而sleep方法却一直占用着资源,当wait()方法被调用时,当前线程会释放所持有的锁资源,但是一个线程获得了锁,即使调用sleep()方法进入休眠,也不会释放锁。
调用obj对象的wait方法的前提是,必须获得该对象的对象锁,因此wait方法必须写在sychronized修饰的代码段内,wait方法常见的场景是,当临界资源的状态不满足特定条件时,调用该对象的wait方法,通常使用循环模式调用wait方法
产品(面包)
缓冲区(面包店)
生产者类(生产面包)
消费者类(消费面包)
并发编程中使用的工具包
run方法没有返回值,要获取现线程的实现结果,就可以通过Callable接口实现
get( )方法可以获得call( )的执行值,如果在获取时任务并没有执行完,当前线程就会被阻塞,知道线程执行完毕,然后才能获取结果。
Runnable和Callable都采用Thread.start()启动线程
用volatile修饰的变量,每次更新对其他线程都是立即可见的。



