多线程的概述
- 进程
- 进程是处于运行过程中的程序
- 线程
- 线程是进程中的一个执行单元
- CPU的运作
- CPU运作时,会在当前的线程中高速随机切换执行,由于其切换的速度非常快,会让人误认为线程是同时执行的
多线程的实现方式
- 实现方式1
- 创建一个类继承Thread
- 重写Thread的run方法,将该线程要执行的内容写在run方法中
- 创建这个类的对象,调用他的start方法开启线程
class MyThread extends Thread{ //创建Thread的子类 @Override public void run(){ System.out.println("线程启动"); //重写Thread的run方法 } } public class Test{ public static void main(String[] args){ MyThread mt = new MyThread(); //创建MyThread类的对象 mt.start(); //调用对象的start方法 } }
- 实现方式2
- 创建一个类实现Runnable接口
- 创建该类的对象
- 创建Thread类的对象,以Runnable的子类当做参数
- 调用Thread对象的start方法
class MyRunnable implements Runnable{ //创建实现Runnable接口的子类 public void run(){ System.out.println("线程启动"); //实现接口的run方法 } } public class Test{ public static void main(String[] args){ MyRunnable mr = new MyRunnable(); //创建MyRunnable类的对象 Thread t = new Thread(mr); //创建Thread的对象并以mr作为参数 t.start(); //调用线程对象的start方法 } }
Thread 类的方法
- 构造方法
Thread(); //分配新的Thread对象 Thread(Runnable target); //分配新的Thread对象 Thread(Runnable target, String name) //分配新的Thread对象
- 常用方法
void setName(String name); //将线程名设为name String getName(); //获取线程名 static Thread currentThread(); //获取当前线程名
多线程的问题
- 多个线程同时操作共享数据的时候,就容易出现线程的安全问题
使用同步代码块解决多线程案例中出现的问题
- 使用Synchronized同步代码块
synchronized(锁对象){ 需要同步的代码; }
- 锁对象
- 锁对象是任意的引用数据类型的对象
- 锁对象在线程运行时会有其被锁定的状态,但这个状态无法在外部被观察或引用到
- 锁对象
- 同步
- 如果几个线程使用的是同一个锁对象,那么这几个线程之间就是同步的
- 同步方法
- 如果一个方法里面所有的代码都被同步代码块括起来了,就可以把这个方法定义为同步方法
- 非静态的同步方法锁对象:this
- 静态的同步方法锁对象:当前类的字节码对象(Class)
死锁和线程的生命周期
- 死锁
- 出现原因
- 线程中的同步代码块的嵌套,导致了多个线程同时等待其他线程释放资源的情况
- 根本原因在于同步代码块的嵌套形成了首尾相接的情况:一个嵌套结构的外层是另一个嵌套结构的内层
- 解决方法
- 尽量不要让同步代码块去嵌套
- 出现原因
- 线程的生命周期
- 新建
- 不具有执行资格
- 不具有执行权
- 就绪
- 具有执行资格
- 不具有执行权
- 运行
- 具有执行资格
- 具有执行权
- 阻塞
- 不具有执行资格
- 不具有执行权
- 死亡
- 新建