java中用代码分析sleep()、yield()、join()的区别
时间: 2023-08-01 07:08:05 浏览: 112
Java线程中yield与join方法的区别
下面是使用Java代码分析sleep()、yield()、join()的区别:
1. sleep()的使用:
```java
public class SleepDemo {
public static void main(String[] args) {
for (int i = 0; i < 5; i++) {
try {
Thread.sleep(1000); // 线程暂停1秒
System.out.println("线程 " + Thread.currentThread().getName() + " 执行中...");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
```
上面的代码中,通过Thread.sleep()方法使当前线程暂停1秒,然后继续执行。在每次暂停的过程中,当前线程会进入阻塞状态,并且不会释放锁。
2. yield()的使用:
```java
public class YieldDemo {
public static void main(String[] args) {
for (int i = 0; i < 5; i++) {
Thread.yield(); // 线程暂停一次,让出CPU时间片
System.out.println("线程 " + Thread.currentThread().getName() + " 执行中...");
}
}
}
```
上面的代码中,通过Thread.yield()方法使当前线程暂停一次,然后让出CPU的时间片,进入就绪状态。在每次暂停的过程中,当前线程不会释放锁,如果没有其他线程抢占CPU的时间,当前线程会立刻重新执行。
3. join()的使用:
```java
public class JoinDemo {
public static void main(String[] args) throws InterruptedException {
Thread threadA = new Thread(() -> {
for (int i = 0; i < 5; i++) {
System.out.println("线程A执行中...");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
Thread threadB = new Thread(() -> {
for (int i = 0; i < 5; i++) {
System.out.println("线程B执行中...");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
threadA.start();
threadA.join(); // 等待线程A执行完毕后再执行下面的代码
threadB.start();
}
}
```
上面的代码中,通过Thread.join()方法使主线程挂起,等待线程A执行完毕后再执行下面的代码。在每次暂停的过程中,当前线程会进入阻塞状态,并且不会释放锁。如果线程A已经执行完毕了,那么主线程会立刻恢复运行,否则主线程会一直等待。
阅读全文