-
创建方法一继承Thread类
- 当子类无父类继承时且需要具有线程特性时
- 创建步骤
- 定义一个类继承Thread类
- 覆盖Thread类中的run方法
- 直接创建Thread的子类对象创建线程
- 调用start方法开启线程会自动调用线程的任务run方法执行。
-
创建方法二实现Runnable接口
- 定义类实现Runnable接口
- 覆盖接口中的run方法,将线程的任务代码封装到run方法中
- 通过Thread类创建线程对象,并将Runnable接口的子类对象作为Thread类的构造函数的参数进行传递
- 调用线程对象的start方法开启线程
注:实现Runnable接口的好处:
- 将线程的任务从线程的子类中分离出来,进行单独的封装,进行了单独的封装。按照面向对象的思想将任务封装成对象
- 避免了java单继承的局限性
-
获取线程名称
- 获取线程对象的名字 getName();
- 获取当前正在运行的线程对象 currentThread()
-
线程状态
-
线程同步
- 多线程同步代码块
- 定义
- 使用synchronized关键字加上一个锁对象来定义一段代码,这就叫同步代码块
- 当同步代码块使用的锁对象是同一个锁时,他们就是同步的
- 注意事项
- 锁对象可以是任意对象,但是被锁的代码需要保证是同一把锁,不能用匿名对象,匿名对象每个线程不是共用一个锁。无法起到同步的作用。
- 定义
- 多线程同步方法
- 定义
- 使用synchronized关键字修饰一个方法,该方法中所有的代码都是同步的
- 注意事项
- 静态的同步函数的锁是:字节码对象(类名.class;)
- 非静态的 同步函数的锁是:this
- 定义
- 解决什么问题
- 当多个线程同时执行时某个线程还未完全执行完CPU就切换了线程,导致异常
- 什么时候使用
- 当多线程并发,有多段代码同时执行时,我们希望某一段代码执行的过程中CPU不要切换到其他线程工作,这是需要同步
- 如果两段代码是同步的,那么同一时间只能执行一段,在一段代码没执行结束之前,不会执行另外一段代码
- 怎么判断需要使用
- 线程间有共享数据
- 需要多次执行(有if,等循环)
- 死锁问题
- 多线程同步的时候,如果同步 代码嵌套,使用相同锁,就有可能出现死锁
- 所以尽量避免嵌套使用
- 多线程同步代码块
版权声明:本博客为记录本人自学感悟,内容大多从网上学习与整理所得,若侵权请告知!
https://mp.csdn.net/postedit/80365677