今日内容 多线程 Thread类 常用构造方法 Thread() Thread(String name) Thread(Runnable r) Thread(Runnable r,String name) 常用方法 void setName(String name):设置线程的名字,如果没有设置线程名字,会有一个默认名字,Thread-x,x从0开始依次递增 String getName():获取线程的名字 static Thread currentThread():获取当前线程的对象(线程创建的第二种方式一定会用这个方法) static void sleep(long millis):让线程休眠,传递的是毫秒值 实现多线程的第二种方式:实现Runnable接口 步骤: (1)自定义一个类实现Runnable接口 (2)重写Runnable接口中的run 方法 public void run() { } (3)在测试类的主方法中创建自定义类的对象 (4)创建Thread类的对象,传递自定义类对象到构造方法中 (5)使用Thread类的对象调用start方法启动线程 // (1)自定义一个类实现Runnable接口 public class MyThread implements Runnable { // (2)重写Runnable接口中的run 方法 @Override public void run() { } } // public class Test { public static void main(String[] args){ // (3)在测试类的主方法中创建自定义类的对象 MyThread mt = new MyThread(); // (4)创建Thread类的对象,传递自定义类对象到构造方法中 Thread th = new Thread(mt); // (5)使用Thread类的对象调用start方法启动线程 th.start(); } } 继承Thread类和实现Runnable接口的区别 继承Thread类 弊端:(1)Java单继承的局限性,如果一个类已经有了父类,不能使用这种方式 或者说如何这个类已经继承了Thread类,就不能再继承其他类 (2)扩展性较差,耦合性较强 优点:直接继承Thread类,就变成了Thread类的子类,Thread类中的方法可以直接使用 使用比较方法 实现Runnable接口 优点:(1)解决单继承的局限性,即使有了父类也可以使用这种方式 或者说使用这种方式,不影响它继续去继承其他类 (2)提高了程序的扩展性,降低了耦合性 弊端: 不能直接使用Thread类中的方法,如果要使用,必须先获取到当前线程对象(currentThread()) 然后再调用反复,使用稍复杂 线程安全问题 出现的原因 多个线程执行共享代码,而且共享的代码有多段 线程安全问题的解决 同步代码块 格式: synchronized(锁对象){ } 锁对象可以是任意对象,但是必须保证多个线程使用的是同一个锁对象 哪个线程获取了锁,哪个线程才能执行同步代码中的方法,而且同一时刻 只能有一个线程获取锁,如果锁已经被别的线程拿到了,其他的线程就不能 再拿到了,必须等之前的线程把锁释放才能再去抢锁,所以同步代码块能够 保证代码块中的代码永远同一时刻只被一个线程执行 位置: 方法中 作用: 解决线程安全问题 同步方法 用synchronized关键字修饰的方法 非静态同步方法 默认锁是this 静态同步方法 默认锁是当前类的字节码对象(类名.class) Lock锁 JDK1.5出现 Java中的代码块(四种) 静态代码块 同步代码块 构造代码块 局部代码块 今日重点: (1)创建线程的第二种方式 (2)说出线程安全问题产生的原因,以及线程安全问题的解决,使用同步代码块的方式
09-15