继承类的方式创建多线程

   1. 定义一个类,然后继承Thread

   2. 覆盖重写run方法

   3. 调用start启动线程

实现接口的方式创建多线程

   1. 定义一个类,实现Runnable接口

   2. 覆盖重写run方法

   3. 创建一个线程,使用Runnable作为构造参数。

   4. 调用start启动线程。

实现接口方式的好处

   1. Runnable接口只有run方法,更加单纯、纯粹。

   2. 更加方便明天线程池的使用。

   3. 接口没有单继承的限制。

安全问题的出现的原因

   根本原因就在于:两个本来不该拆开的动作中间,被其他线程插足了。

   解决方案:   1. 同步代码块

                        2. 同步方法

                        3. Lock接口

                               上锁:lock();

                               释放锁:unlock();

同步代码块解决线程安全问题

   syn-chro-ni-zed

   synchronized (锁对象) {

          // …

   }

   注意:

          1. 锁对象必须是引用类型,不能使基本类型。

          2. 多个线程之间的通信必须使用通一把锁,才能竞争。

同步方法解决线程安全问题

   修饰符 synchronized 返回值类型 方法名称(参数列表) {…}

   修饰符 static synchronized 返回值类型 方法名称(参数列表) {…}

   锁对象是谁:

          1. 对于成员方法:this

          2. 对于静态方法:类名称.class,反射对象

线程6个状态的名称

   NEW:创建了,但是还没有启动

   RUNNABLE:已经启动了,可以运行

   BLOCKED:锁阻塞,抢锁没抢到,焦急挠门、砸门、跺脚……

   WAITING:平静无限等待,不会抢锁的。死等。

   TIMED_WAITING:平静定时等待。如果时间没到,有通知,我也会醒来;如果时间到了,没通知,我也会醒来。

   TERMINATED:结束,死亡。

  

   public void sleep(long time):睡眠一会儿,与锁竞争无关。不会释放锁,也不会抢锁。

   public void wait():释放锁,然后进入WAITING无限等待。

   public void wait(long time):释放锁,然后进入TIMED_WAITING定时等待。

   public void notify():不会释放锁,只是通知在锁上出于等待状态的人,结束等待。(真正释放锁是离开sync范围的时候)
Last modification:July 29th, 2019 at 05:27 pm