java多线程阻塞状态和等待状态的区别
时间: 2024-06-18 12:02:38 浏览: 16
Java中的多线程可以处于不同的状态,其中阻塞状态和等待状态是两种常见的状态。它们的区别如下:
1. 阻塞状态
阻塞状态是指线程因为某种原因而暂时停止执行,等待一些条件满足后再继续执行。常见的阻塞情况有:
- 线程调用了sleep()方法,使得线程进入休眠状态;
- 线程调用了wait()方法,等待其他线程的通知;
- 线程调用了join()方法,等待另一个线程执行完毕;
- 线程试图获得一个锁,但是该锁已经被其他线程占用。
在以上情况下,线程都会进入阻塞状态,暂时停止执行。
2. 等待状态
等待状态是指线程在等待某个条件满足时,主动挂起自己的状态。在等待状态下,线程不会占用CPU资源,直到被其他线程唤醒或者等待时间超时才会继续执行。常见的等待情况有:
- 线程调用了wait()方法,等待其他线程的通知;
- 线程调用了park()方法,等待其他线程的唤醒;
- 线程调用了LockSupport.park()方法,等待其他线程的唤醒。
在以上情况下,线程都会进入等待状态,主动挂起自己。
相关问题
java多线程实现以及状态
Java多线程实现方式主要有四种:继承Thread类、实现Runnable接口、实现Callable接口通过FutureTask包装器来创建Thread线程、使用ExecutorService、Callable、Future实现有返回结果的多线程。其中前两种方式线程执行完后都没有返回值,后两种是带返回值的。
1. 继承Thread类重写run方法创建线程:
```java
public class MyThread extends Thread{
@Override
public void run() {
System.out.println("Thread");
}
}
```
2. 实现Runnable接口创建线程:
```java
public class MyRunnable implements Runnable{
@Override
public void run() {
System.out.println("Runnable");
}
}
```
线程状态包括以下几种:
1. NEW:新建状态,线程被创建但还没有被启动。
2. RUNNABLE:运行状态,线程正在执行或者等待CPU时间片。
3. BLOCKED:阻塞状态,线程被阻塞并等待获取一个排它锁。
4. WAITING:等待状态,线程等待其他线程执行完毕。
5. TIMED_WAITING:超时等待状态,线程等待其他线程执行完毕,但是有超时时间限制。
6. TERMINATED:终止状态,线程执行完毕或者被强制终止。
java 多线程怎么获取线程状态
Java中可以通过Thread类的getState()方法获取线程状态。该方法返回一个枚举类型Thread.State,表示线程的状态。Thread.State枚举类型包括以下几个值:
1. NEW:线程刚被创建,但还没有被启动。
2. RUNNABLE:线程正在运行或准备运行。
3. BLOCKED:线程被阻塞等待监视器锁定。
4. WAITING:线程正在等待另一个线程执行特定操作。
5. TIMED_WAITING:线程在指定时间内等待另一个线程执行特定操作。
6. TERMINATED:线程已经执行完毕。
以下是一个简单的例子,演示如何获取线程状态:
```
public class ThreadDemo extends Thread {
public void run() {
System.out.println("线程开始执行...");
}
public static void main(String[] args) {
ThreadDemo thread = new ThreadDemo();
System.out.println("线程状态:" + thread.getState());
thread.start();
System.out.println("线程状态:" + thread.getState());
}
}
```
输出结果为:
```
线程状态:NEW
线程状态:RUNNABLE
线程开始执行...
```