线程的几个状态
- NEW 线程尚未开始执行状态. 还没有执行
start()
- RUNNABLE 运行线程的状态,在JVM中处于运行状态中的Thread可能需要等待操作系统的资源,例如CPU
- BLOCKED 线程阻塞等待获取锁🔒。进入一个 synchronized 同步块或者是同步方法,或者是重入一个 synchronized 同步块或者是同步方法
- WAITING 线程处于waiting状态,是由于调用了一下几个方法,一个线程处于该状态是正在等待另一个线程执行特定的动作
- Object.wait with no timeout
- Thread.join with no timeout
- LockSupport.park
- 例子
- 一个线程调用
object
上的object.wait()
是等待另外一个线程执行特定的object
上的Object.notify()
或者是Object.notifyAll()
- 一个线程调用
Thread.join()
是等待另外一个线程来中断。
- 一个线程调用
- TIMED_WAITING 线程等待一个具体的时间,由于掉用了以下几个方法
- Thread.sleep
- Object.wait with timeout
- Thread.join with timeout
- LockSupport.parkNanos
- LockSupport.parkUntil
- TERMINATED 线程已经执行完成
NEW
final Thread thread = new Thread(() -> System.out.println("xxx"));
System.out.println(thread.getState());
RUNNABLE AND TERMINATED
final Thread thread = new Thread(() -> {
while (!Thread.currentThread().isInterrupted()) {
int i = 0;
}
System.out.println("gg");
});
thread.start();
Thread.sleep(100);
System.out.println(thread.getState());
thread.interrupt();
Thread.sleep(5000);
System.out.println(thread.getState());
BLOCKED
```java public static void main(String[] args) throws Exception { {
} {final Thread thread = new Thread(ThreadTest::method);
thread.setName("thread1");
thread.start();
Thread.sleep(1000);
System.out.println(thread.getState());//==>TIMED_WAITING
} }final Thread thread = new Thread(ThreadTest::method);
thread.setName("thread2");
thread.start();
Thread.sleep(1000);
System.out.println(thread.getState());//==>BLOCKED
public static synchronized void method() { try { Thread.sleep(10000); } catch (InterruptedException ignore) { } }
<a name="JLRKo"></a>
#### WAITING
```java
final Thread thread = new Thread(() -> {
synchronized (lock) {
try {
lock.wait();
} catch (InterruptedException e) { e.printStackTrace(); } }
});
thread.start();
Thread.sleep(1000);
System.out.println(thread.getState());//output ==> WAITING
TIMED_WAITING
final Thread thread = new Thread(() -> {
synchronized (lock) {
try {
lock.wait(5000);
} catch (InterruptedException e) { e.printStackTrace(); } }
});
thread.start();
Thread.sleep(1000);
System.out.println(thread.getState());//output ==> TIMED_WAITING
熟练掌握线程掉几个运行状态在使用 jstack pid
的时候能够更加得心应手。对应 ThreadPool
中的Thread应该处于什么状态的理解会更加深刻。
线程状态转换
守护线程和非守护线程
以前看书的时候看到一个问题,JVM会在什么时候退出。在那个问题里边第一次见识到了 守护线程
和 非守护线程
的概念。
其中一个答案就是,所有处于运行中的 非守护线程
都执行完毕了。
- thread.setDaemon(false); 设置为非守护线程
- thread.setDaemon(true); 设置为守护线程
如果不指定,默认用当前线程是否守护线程。
如果我想要main方法中JVM持续运行,不退出,只要Thread设置成非守护线程就可以了 ( 哈哈,main线程是非守护线程啦)
线程的几个方法
interrupt 中断
join
等待当前线程死亡,使用循环的wait来实现的。
使用场景: 主线程启动了一个子线程A,需要等待子线程A执行完毕后主线程在继续执行
Thread a = new Thread(()->{});
a.start();
a.join();
//继续执行
yield
Java是线程执行是时间片分片执行的,使用yield让出自己的时间片,当然CPU可不听。
引申
1、start后能否再调用start (不能,会抛出IllegalThreadStateException)
2、java中的线程有哪几种状态(xdm自己去看源码),跟操作系统的有什么区别?
2.1、对应了linux系统中的pthread,操作系统的线程只有3中状态,分别是ready,runnable,waiting
3、如果用了setdemon什么效果?主线程和守护线程区别
3.1、守护线程,JVM不会退出
3.2、非守护线程,JVM会退出