1 知识点
- 概念理解:程序、进程、线程
- 单线程 和 多线程
- 并发 和 并行
- 线程的使用:继承Thread类 和 实现Runnable接口
- Thread类 VS 实现Runnable接口
- 线程常用方法
- 用户线程 和 守护线程
- 线程的生命周期
- 线程同步机制
- 互斥锁
- 线程死锁
- 释放锁 和 不释放锁的情况
2 手写笔记
3 代码演示窗口售票
- 代码:
package threaduse;
/**
* @author Li
* @data 2022/3/20 - 14:49
*/
public class SellTicket {
public static void main(String[] args) {
SellTicket01 sellTicket01 = new SellTicket01();
SellTicket01 sellTicket02 = new SellTicket01();
SellTicket01 sellTicket03 = new SellTicket01();
sellTicket01.start();
sellTicket02.start();
sellTicket03.start();
}
}
class SellTicket01 extends Thread{
// 100张
private sttic int TicketNum = 10;
@Override
public void run(){
while(true){
if(TicketNum <= 0){
System.out.println("====售票结束====");
break;
}
System.out.println("窗口1" + Thread.currentThread().getName() + "售出1张票(剩余" + (--TicketNum) + "张)");
//休眠50毫秒
try {
Thread.sleep(50);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
- 输出结果分析:
4 解决多线程售票问题——synchronized关键字
package threaduse;
/**
* @author Li
* @data 2022/3/20 - 14:49
*/
public class SellTicket {
public static void main(String[] args) {
// SellTicket01 sellTicket01 = new SellTicket01();
// SellTicket01 sellTicket02 = new SellTicket01();
// SellTicket01 sellTicket03 = new SellTicket01();
//
// sellTicket01.start();
// sellTicket02.start();
// sellTicket03.start();
SellTicket01 sellTicket04 = new SellTicket01();
// 要求多个线程的锁对象为同一个。
new Thread(sellTicket04).start();
new Thread(sellTicket04).start();
new Thread(sellTicket04).start();
}
}
//使用synchronized实现线程同步:
class SellTicket01 extends Thread{
// 100张
private static int ticketNum = 10;
private static boolean loop = true;
// 卖票函数
// 同步方法
public synchronized void sell(){
if (ticketNum <= 0) {
System.out.println("====售票结束====");
loop = false;
return;
}
//休眠50毫秒
try {
Thread.sleep(50);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("窗口1" + Thread.currentThread().getName() + "售出1张票(剩余" + (--ticketNum) + "张)");
}
@Override
public void run(){
while(loop) {
sell();
}
}
}