文章目录
- 一、Java线程相关的API
- 1、start():启动线程
- 2、run():
- 3、join() 等待线程运行结束
- 4、getId(): 获取线程长整型的id,id唯一
- 5、getName():获得线程名, setName(): 设置线程名
- 6、getPriority():获取线程的优先级, setPriority(int):修改线程优先级
- 7、getState():获取线程状态
- 8、isInterrupted()、interrupt()、Thread.interrupted()
- 9、isAlive():线程是否存活(还没有运行结束)
- 10、sleep():静态方法,让当前线程休眠n毫秒,让出cpu的事件片
- 11、Thread.yield():静态方法
- 12、setDaemon(true):驻守后台,守护线程(Daemon)
- 13、线程组(ThreadGroup):分门别类的管理
一、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()
:打断线程
- 如果线程正在
sleep
、wait
、join
会导致被动打断的线程抛出异常,并清除打断标记
。 - 如果打断正在运行的线程,则会设置
打断标记
,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版权协议,转载请附上原文出处链接和本声明。