Java 多线程三、线程间的通信
2021-02-03 07:15
标签:ack wait 代码 rri 面试 http r++ ring new t 多线程之间是可以相互通信的,当一个线程使用 示例: 使用两个线程打印 1~100 中的数字,实现交替打印,即先线程1打印,在线程2打印,再线程1,再线程2... 以此类推。 代码如下: 打印结果如下: 说明: 注意: 例如:上述码中调用 简单的来说,就是调用 如下代码:演示 sleep 和wait有什么异同? 1.相同点:一旦执行方法,都可以使得当前线程进入阻塞状态。 2.不同点: Java 多线程三、线程间的通信 标签:ack wait 代码 rri 面试 http r++ ring new t 原文地址:https://www.cnblogs.com/vpersie2008/p/12804288.html一、线程通信
wait()
阻塞当前线程时,另一个线程可以用 notify()
或 notifyAll()
方法来唤醒正在阻塞的线程,从而实现线程通信。public class ThreadNotifyTest {
public static void main(String[] args) {
Number num = new Number();
Thread t1 = new Thread(num);
Thread t2 = new Thread(num);
t1.start();
t2.start();
}
}
class Number implements Runnable {
private int number = 1;
@Override
public void run() {
while (true) {
synchronized (this) {
//唤醒被阻塞的线程,之前线程1被阻塞,线程2进来notify线程1唤醒
this.notify();
// this.notifyAll();//唤醒所有正在被wait的线程
if (number
wait()
方法,用于阻塞当前线程,这个方法执行时会释放当前锁,而 sleep()
不会释放当前锁。
notify()
方法,通知正在被阻塞的线程,将其唤醒,如果有多个线程被 wait()
,则优先唤醒优先级高的那个。
notifyAll()
方法,通知并唤醒所有被wait()
的线程。
notify
和wait
都是在this
对象下的,即用的是this当锁的,如果重新起一个 obj
对象,this
还是锁,使用obj.wait()
肯定是不行的。
notify
和wait
的对象,必须是当前锁对象。
Thread
类中定义的,这三个方法,是在Object 类中定义的。因为任何一个对象都有这几个方法,即这几个方法在最终父类中。notify
和 wait
,必须是在当前锁对象下。public class ThreadNotifyTest2 {
public static void main(String[] args) {
Number2 num = new Number2();
Thread t1 = new Thread(num);
Thread t2 = new Thread(num);
t1.start();
t2.start();
}
}
class Number2 implements Runnable {
private int number = 1;
//使用obj对象充当当前锁。
Object obj = new Object();
@Override
public void run() {
while (true) {
synchronized (obj) {
obj.notify();
// this.notifyAll();//唤醒所有正在被wait的线程
if (number
二、面试题
Thread
类中声明sleep()
,Object
类中声明 wait()
sleep()
可以在任何需要的场景下调用,wait()
必须在同步代码块或同步方法中。
sleep
不会释放锁,而wait
会释放锁。
上一篇:C语言打印菱形数字
下一篇:Spring的Bean管理