Day01-多线程

线程的创建方式

继承Thread

继承Thread后重写run方法,之后只需要创建子类对象,使用子类对象调用start()方法来开启线程

这种方式可以直接使用Thread的方法,但可扩展性差

实现runable接口

通过实现runable接口并重写run方法,之后需要创建实现类对象并将其作为参数传递给Thread(实现类)构造函数来创建一个线程,之后使用Thread对象调用Start()方法来开启线程

这种方式实现类无法直接使用Thread方法,必须依靠Thread对象,实现类作为任务对象存在

实现类内部依靠Thread.currentThread()方法来获取当前线程的对象之后才可以在实现类内使用Thread方法了

实现callable接口和Future接口

上述两种方法都是没有返回值的,当需要线程的返回值时需要使用这种方法

实现Callable<返回值类型>接口并创建实现类对象,然后将实现类对象作为参数传递给构造函数来创建FutureTask<返回值类型>对象来管理返回值,之后将FutureTask<返回值类型>对象作为参数传递给Thread(实现类)构造函数来创建一个线程,之后使用Thread对象调用Start()方法来开启线程

可以使用FutureTask<返回值类型>对象的方法get()来获取返回值

缺点也是无法直接使用Thread方法

Thread常用方法

void setName(String name),给线程设置名字,也可以在创建线程时直接设置名字

String getName(),获取线程名字,如果没设置名字,则默认thread-序号

Thread currentThread(),获取当前线程

static void sleep(long millis),线程休眠,单位毫秒

final int getPriority(),获取线程优先级

final void setPriority(int newPriority),设置线程优先级,默认为5,最小1,最大10

void setDaemon(boolean on),设置为守护线程,当非守护线程结束时,守护线程会跟着陆续结束(不是立即结束)

static void yield(),礼让线程

static void join(),插入线程,将线程插入到当前线程之前,当前线程就是join执行的线程

生命周期

  • 创建
  • 就绪,此时线程开始抢夺CPU执行权但未执行
  • 运行,抢到CPU执行权后开始执行代码,如果此时被抢走CPU执行权会回到就绪状态
  • 阻塞,遇到sleep等阻塞方法,阻塞结束后会回到就绪状态
  • 死亡,线程代码执行完毕