创建方法一继承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,等循环)
死锁问题 多线程同步的时候,如果同步 代码嵌套,使用相同锁,就有可能出现死锁 所以尽量避免嵌套使用