Java并发编程3:线程Thread常用的API

一、Java线程相关的API

1、start():启动线程

启动一个新新线程,在新的线程中运行run方法

  • 线程状态从新建状态 —> 就绪状态
  • 多次调用start()会抛出IllegalThreadStatusException

2、run():

新线程启动后会自动调用的方法,如果直接在调用run()方法,是不会创建一个新的线程的,而是直接在本线程内运行run()方法。

3、join() 等待线程运行结束

  • 因为主线程的和线程t1是并行执行的,t1线程需要多少时间才能计算出来,这往往是不能确定的,所以需要join方法
  • 使用sleep方法不行,因为很很难精确的直到t1线程的计算时间。

从调用者的角度来讲:有同步和异步

  • 需要等待结果的返回,才能继续运行就是同步
  • 不需要等待结果的返回,就能继续运行就是异步

4、getId(): 获取线程长整型的id,id唯一

5、getName():获得线程名, setName(): 设置线程名

  • 可以在创建线程的时候作为参数,传递给线程

6、getPriority():获取线程的优先级, setPriority(int):修改线程优先级

  • Java规定线程优先级是1~10的整数。较大的优先级会提高线程被CPU调度的几率
  • 线程优先级会提调度器有明显调度该线程,但是者仅仅是一个提示,调度器可以忽略它
  • 如果CPU比较忙,那么优先级高的线程会获得更多的事件片,但对于CPU悠闲的时候,优先级几乎没有作用。

7、getState():获取线程状态

Java中线程状态用6个enum值来表示

  • NEW:新建状态

  • RUNNABLE:运行状态

  • BLOCKED:阻塞状态

  • WAITING:等待状态

  • TIME_WAITING:有限等待状态

  • TERMINATED: 结束状态

8、isInterrupted()、interrupt()、Thread.interrupted()

isInterrupted():判断是否被打断,不会清除打断标记

interrupt():打断线程

  • 如果线程正在sleepwaitjoin会导致被动打断的线程抛出异常,并清除打断标记
  • 如果打断正在运行的线程,则会设置打断标记park的线程被打断也会设置打断标记

Thread.interrupted():静态方法,判断当前线程是否被打断

9、isAlive():线程是否存活(还没有运行结束)

10、sleep():静态方法,让当前线程休眠n毫秒,让出cpu的事件片

在没有利用cpu来计算时,不要使用while(true)空转浪费cpu,可以使用yield()或者sleep()来让出cpu资源给其他程序。

  • 利用wait或者条件变量同样可以达到类似的效果

但是sleep()wait()不同

  • sleep()可使用于无需锁同步的场景。
  • wait()方法和条件变量需要加锁,并且需要响应的唤醒操作,一般适用于要进行的同步场景

11、Thread.yield():静态方法

提示线程调度器让出,主要是为了测试和调试当前线程堆CPU的使用

12、setDaemon(true):驻守后台,守护线程(Daemon)

  • 特点:如果用户线程结束了,守护线程就会随之结束,典型的就是垃圾收集线程。

主线程和守护线程的概念

  • 默认情况下,Java虚拟机等待所有线程都运行结束,才结束,有一些特殊线程称为守护线程

  • 只要用户线程运行结束了,即时守护线程的代码没有执行完,也会强制结束。

  • 注意

    • 垃圾回收线程就是一种守护线程。
    • Tomcat中的Acceptor和Poller线程都是守护线程,所以Tomcat接受到shutdown命令后,不会等待其他处理完当前请求。

13、线程组(ThreadGroup):分门别类的管理

  • 如果线程数量多,同时功能分配比较明确,就可以将相同功能的线程防止到一个线程组里。

版权声明:本文为Hicodden原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。