A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 俊哥哥 初级黑马   /  2018-12-12 09:45  /  821 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

【Thread类】构造方法
public Thread() :
分配一个新的线程对象。

public Thread(String name) :
分配一个指定名字的新的线程对象。

public Thread(Runnable target) :
分配一个带有指定目标新的线程对象。

public Thread(Runnable target,String  name) :
分配一个带有指定目标新的线程对象并指定名字。


   常用方法:
  public String getName() :
获取当前线程名称。

  public void start() :
  导致此线程开始执行; Java虚拟机调用此线程的run方法。

  public void run() :
  此线程要执行的任务在此处定义代码。

  public static void sleep(long millis) :使当前正在执行的线程以指定的毫秒数暂停(暂时停止执行)。

  public static Thread currentThread() :返回对当前正在执行的线程对象的引用。


  实现Runnable接口比继承Thread类所具有的优势:
  1. 适合多个相同的程序代码的线程去共享同一个资源。
  2. 可以避免java中的单继承的局限性。
  3. 增加程序的健壮性,实现解耦操作,代码可以被多个线程共享,代码和线程独立。
  4. 线程池只能放入实现Runable或Callable类线程,不能直接放入继承Thread的类。




创建多线程程序的第二种方式:
  实现Runnable接口  java.lang.Runnable
  Runnable 接口应该由那些打算通过某一线程执行其实例的类来实现。类必须定义一个称为 run 的无参数方法。

   java.lang.Thread类的构造方法
    Thread(Runnable target)
    分配新的 Thread 对象。

   Thread(Runnable target, String name)    分配新的 Thread 对象。


  第二种方法实现步骤:
1.创建一个Runnable接口的实现类
2.在实现类中重写Runnable接口的run方法,设置线程任务
3.创建一个Runnable接口的实现类对象
4.创建Thread类对象,构造方法中传递 Runnable接口的实现类对象
5.调用Thread类中的start方法,开启新的线 程执行run方法

代码目标**高内聚,低耦合**

实现Runnable接口创建多线程程序的好处:
  1.避免了单继承的局限性
   一个类只能继承一个类(一个人只能有一个亲爹),类继承了Thread类就不能继承其他的类
    实现了Runnable接口,还可以继承其他的类,实现其他的接口

  2.增强了程序的扩展性,降低了程序的耦合性(解耦)
    实现Runnable接口的方式,把设置线程任务和开启新线程进行了分离(解耦)
   实现类中,重写了run方法:用来设置线程任务
   创建Thread类对象,调用start方法:用来开启新线程

  同步代码块:(效率较高)
   格式:
        synchronized(锁对象){
     可能会出现线程安全问题的代码(访问了共享数据的代码)
        }

    注意:
1.通过代码块中的锁对象,可以使用任意的对象
2.但是必须保证多个线程使用的锁对象是同一个
3.锁对象作用:
  把同步代码块锁住,只让一个线程在同步代码块中执行


  第二种方案:使用同步方法
    使用步骤:
1.把访问了共享数据的代码抽取出来,放到一个方法中
  2.在方法上添加synchronized修饰符

  格式:定义方法的格式
    修饰符 synchronized 返回值类型 方法名(参数列表){
    可能会出现线程安全问题的代码(访问了共享数据的代码)

  静态方法的锁对象是本类的class属性-->class文件对象(反射)



  解决线程安全问题的三种方案:使用Lock锁
    java.util.concurrent.locks.Lock接口
    Lock 实现提供了比使用 synchronized 方法和语句可获得的更广泛的锁定操作。
    Lock接口中的方法:
        void lock()获取锁。
        void unlock()  释放锁。
     java.util.concurrent.locks.ReentrantLock implements Lock接口


    使用步骤:
  1.在成员位置创建一个ReentrantLock对象
   2.在可能会出现安全问题的代码前调用Lock接口中的方法lock获取锁
   3.在可能会出现安全问题的代码后调用Lock接口中的方法unlock释放锁


只有锁对象才能调用wait和notify方法

  Obejct类中的方法
  void wait()
在其他线程调用此对象的 notify() 方法或 notifyAll() 方法前,导致当前线程等待。

   void notify()
   唤醒在此对象监视器上等待的单个线程。
   会继续执行wait方法之后的代码



进入到TimeWaiting(计时等待)有两种方式
    1.使用sleep(long m)方法,在毫秒值结束之后,线程睡醒进入到Runnable/Blocked状态
    2.使用wait(long m)方法,wait方法如果在毫秒值结束之后,还没有被notify唤醒,就会自动醒来,线程睡醒进入到Runnable/Blocked状态

    唤醒的方法:
         void notify() 唤醒在此对象监视器上等待的单个线程。
         void notifyAll() 唤醒在此对象监视器上等待的所有线程。

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马