首页 > 其他分享 >多线程问题sleep与wait

多线程问题sleep与wait

时间:2022-10-09 13:44:46浏览次数:59  
标签:同步 Thread 线程 sleep 多线程 方法 wait

涉及到的三个方法:
wait():一旦执行此方法,当前线程就进入阻塞状态,并释放同步监视器
notify():一旦执行此方法,就会唤醒被wait的一个线程。如果有多个线程被wait,就唤醒优先级高:
notifyALL():一旦执行此方法,就会唤醒所有被wait的线程。
说明:
1.wait(),notify():notifyAll()三个方法必须使用在同步代码块或同步方法中。
2.wQit(),notify(),notifyALL()三个方法的调用者必须是同步代码块或同步方法中的同步监视器
否则,会出现ILLegaLMonitorstateException.异常
3.wait(),notify(),notifyAlL()三个方法是定义在java.lang.Object类中
面试题:sLeep()和wait()的异同?
1.相同点:一且执行方法,都可以使得当前的线程进入阻塞状态。
2.不同点:1)两个方法声明的位置不同:Thread.类中声明sLeep(),Object.类中声明wait()
     2)调用的要求不同:sleep()可以在任何需要的场景下调用。w阳it()必领使用在同步代码块

package exer4;
/**
 * @author 高槐玉
 * #Description 线程通信的例子: 使用两个线程打印 线程1 线程2 交替打印0-100
 * #Date: 2022/10/9/12点44分
 * #Shangguigu:439集
 */
class Number implements Runnable{

        private int i = 0;
    @Override
    public void run() {
        while (true){
            synchronized (this) {
                notify();
                if (i < 100) {
                    try {
                        Thread.sleep(500);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println(Thread.currentThread().getName() + ":" + i);
                    i++;
                    try {
                        wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }

            }
    }
    }
}
public class CommunicationTest {
    public static void main(String[] args) {
        Number num1 = new Number();
        Thread t1 = new Thread(num1);
        Thread t2 = new Thread(num1);
        t1.setName("线程1");
        t2.setName("线程2");
        t1.start();
        t2.start();
    }
}

 


     3)关于是否释放同步监视器:如果两个方法都使用再同步代码块或同步方法中,sleep()不会释放锁,wait会释放锁

标签:同步,Thread,线程,sleep,多线程,方法,wait
From: https://www.cnblogs.com/gaohuaiyu/p/16771849.html

相关文章

  • 多线程篇4:工具类
    一、Semaphore、Exchanger、CountDownLatch、CyclicBarrier、PhaserJDK中提供了⼀些线程通信⼯具类以供开发者使⽤。这样的话我们在遇到⼀些常⻅的应⽤场景时就可以使⽤这......
  • Java多线程(二)线程创建
    三种创建方式1.继承Thread类2.实现Runnable接口3.实现Callable接口(了解) 继承Thread类自定义线程继承Thread类重写run()方法,编写线程执行体创建线程对象,调用start(......
  • Java 多线程(一)线程简介
    多任务类似于这些例子,现实生活中太多太多了。看起来是多个任务在做,其实本质上我们的大脑再同一时间依旧只做一件事。 多线程  原来是一条路,慢慢的因为车多起来......
  • react e.stopPropagation() 前调用 await 耗时操作 的坑
    代码如下<divonClick={e=>{e.stopPropagation();}}/>这样是能阻止冒泡的,e.stopPropagation();能正常执行但是下面这样写是不行的<divonClick=......
  • wait()和sleep()的区别
    一、sleep()和wait()的区别1、相同点sleep()和wait()都可以暂停线程的执行。2、不同点所在类不同sleep()是Thread类的静态方法。wait()是Object类的方法。锁释放不......
  • Python多线程
    一、概念线程是CPU分配资源的基本单位,当程序开始运行,这个程序就变成了一个进程;当有多线程编程时,一个进程包含多个线程(含主线程),使用线程可以实现程序大的开发任务。多线......
  • Java_多线程
    Java_多线程1.实现多线程1.1进程和线程【理解】进程:是正在运行的程序是系统进行资源分配和调用的独立单位每一个进程都有它自己的内存空间和系统资源线程:是进程......
  • 消灭异步回调,还得是async-await
    本篇,带你读懂async~await间的浪漫。关于异步处理问题,ES5的回调让我们陷入回调地狱轮回,后来ES6的Promise(Promise不了解?点这了解)让我们脱离轮回,终于,ES7的async-await带我们......
  • Delphi xe TTask 执行多线程,其实...完成任务后,一直在后台执行东西的。
    usesSystem.Threading;//定义变量线程池lpThreadPool:TThreadPool;//定义事件procedureTForm1.log(lgoInfo:string);beginMemo1.Lines.Add('');Me......
  • 【开悟篇】Java多线程之JUC从入门到精通
    1.多线程J.U.C1.1线程池1.1.1线程回顾1)回顾线程创建方式继承Thread实现Runnable2)线程的状态NEW:刚刚创建,没做任何操作Threadthread=newThread();System.out.println(......