多线程二

102 阅读2分钟

这是我参与8月更文挑战的第2天,活动详情查看:8月更文挑战

多线程启动和运行

​ 线程启动是调用start()方法进行启动,实质就是请求jvm运行相应的线程,这个线程具体什么时候运行由线程调度器决定。

注:

  • start()方法调用结束,并不一定子线程开始运行
  • 新开启的线程会调用run()方法
  • 如果是启动多个线程,start()调用的顺序不一定是子线程运行的顺序
  • 多线程运行结果与代码调用顺序或执行调用顺序无关

常用的线程方法

1.currentThread()方法

  • Thread.currentThread() 可以获得当前线程,返回当前的线程对象。

2.setName()/getName()

  • thread.setName() 设置线程名称
  • thread.getName() 获取线程名称

3.isAlive()

  • thread.isAlive() 判断当前线程是否处于活动状态

4.sleep()

  • Thread.sleep(millis) 让当前线程睡眠指定的毫秒数。1000 ms == 1 s

5.getId()

  • thread.getId() 获得线程唯一标识(注:线程技术后,该编号可能被新创建的线程使用)

6.yield()

  • Thread.yield() 放弃当前CPU资源。()

7.setPriority()

  • thread.setPriority(num) 设置线程的优先级
  • num的取值范围 : [1,10] 。超会范围会抛出异常
  • 优先级越高的线程获得CPU资源越多(注:当优先级的程序过多,可能会出现线程饥饿现象)

8.interrupt()

  • thread.interrupt() 线程中断

9.setDaemon()

  • thread.setDaemon(true); 设置守护进程

线程的生命周期

thread.getState()方法获得线程的生命周期状态。

线程的状态是Thread.State枚举类类型定义的。

  • NEW,新建状态,创建了线程对象,在调用start()启动之前的状态
  • RUNNABLE,可运行状态,负荷状态包含:READY和RUNNING两个状态
    • READY:线程可以被线程调度器进行调度
    • RUNNING:线程正在执行,可通过Thread.yield()变为READY状态
  • BLOCKED: 线程堵塞。线程发起I/O操作或者申请由其他线程占用的资源,线程会转换为BLOCKED阻塞状态。处于阻塞状态的线程不占用CPU资源,当阻塞I/O执行完成或者线程获得了申请的资源,线程可以转换为RUNNABLE状态
  • WAITING:等待状态。线程执行了obj.wait(),thread.join()方法会让线程装换为WAITING等待状态,执行obj.notify()方法或加入的线程执行完毕,当前线程会转换为RUNNABLE状态
  • TIMED_WAITRING状态,与WAITING状态类似,都是等待状态。区别在于处于该状态的线程不会无限的登台,如果线程没有在指定的时间范围内完成期望的操作,该线程会转换为RUNNABLE状态
  • TERMINATED,终止状态,线程结束处于终止状态。