一、多线程——一个应用程序有多条执行路径
2、进程:正在执行的应用程序
3、线程:进程的执行单元,执行路径
4、多线程:一个应用程序有多条执行路径
~多进程的意义?——提高CPU的使用率
~多线程的意义?——提高应用程序的使用率
二、Java程序的运行原理及JVM的启动时多线程的吗?
A:Java命令去启动JVM,JVM会启动一个进程,该进程会启动一个主线程
B:JVM的启动是多线程的,因为它最低有两个线程启动了,主线程和垃圾回收线程
三、多线程的实现方案
A:继承Thread类
/*
* 方式1:继承Thread类。
* 步骤
* A:自定义类MyThread继承Thread类。
* B:MyThread类里面重写run()?
* 为什么是run()方法呢?
* C:创建对象
* D:启动线程
*/
public class MyThread extends Thread {
@Override
public void run() {
for (int i = 0; i < 100; i++) {
System.out.println(getName() + ":" + i);
}
}
}
public class MyThreadDemo {
public static void main(String[] args) {
// 创建两个线程对象
MyThread my1 = new MyThread();
MyThread my2 = new MyThread();
// 启动线程
my1.start();
my2.start();
}
}
B:实现Runnable接口
/*
* 方式2:实现Runnable接口
* 步骤:
* A:自定义类MyRunnable实现Runnable接口
* B:重写run()方法
* C:创建MyRunnable类的对象
* D:创建Thread类的对象,并把C步骤的对象作为构造参数传递
*/
public class MyRunnable implements Runnable {
@Override
public void run() {
// TODO Auto-generated method stub
for (int i = 0; i < 100; i++) {
System.out.println(Thread.currentThread().getName() + ":" + i);
}
}
}
public class MyRunnableDemo {
public static void main(String[] args) {
// 创建MyRunnable类的对象
MyRunnable mr = new MyRunnable();
Thread t1 = new Thread(mr, "CC");
Thread t2 = new Thread(mr, "DD");
t1.start();
t2.start();
}
}
四、线程的调度和优先级问题
A:线程的调度 | B:获取和设置线程优先级 * 如何获取线程对象的优先级? * public final int getPriority():返回线程对象的优先级 * 如何设置线程对象的优先级呢? * public final void setPriority(int newPriority):更改线程的优先级。
|
a:分时调度 | a:默认是5 |
b:抢占式调度 (Java采用的是该调度方式) | b:范围是1-10 |
五、线程的控制(方法)
A:休眠线程 public static void sleep(long millis) |
B:加入线程 public final void join():等待该线程终止。 |
C:礼让线程 public static void yield():暂停当前正在执行的线程对象,并执行其他线程。 |
D:后台线程 public final void setDaemon(boolean on) |
E:终止线程(掌握) public void interrupt() |
六、线程的生命周期
新建——就绪——运行——阻塞——死亡
七、电影卖票程序的实现
A:继承Thread类
B:实现Runnable接口
八、电影院卖票程序出问题
A:为了更符合真实场景,加入了休眠100ms
B:买票问题 a:同票多次 b:负数票
九、多线程安全问题的原因(也是我们以后判断一个程序是否有线程安全问题的依据)
A:是否有多线程环境B:是否有共享数据
C:是否有多条语句操作共享数据
十、同步解决线程安全问题
A:同步代码块synchronized(对象) {
需要被同步的代码;
}
这里的锁对象可以是任意对象。
B:同步方法
把同步加在方法上。
这里的锁对象是this
C:静态同步方法
把同步加在方法上。
这里的锁对象是当前类的字节码文件对象(反射再讲字节码
十一、回顾以前的线程安全的类
A:StringBufferB:Vector
C:Hashtable
D:如何把一个线程不安全的集合类变成一个线程安全的集合类
用Collections工具类的方法即可。