首页 > 编程语言 >Java多线程____wait(), notify(), notifyAll()等方法介绍

Java多线程____wait(), notify(), notifyAll()等方法介绍

时间:2023-09-13 12:33:06浏览次数:57  
标签:Java Thread notifyAll 线程 notify 多线程 TestThread wait


在JDK中,定义了wait(), notify()和notifyAll()等接口。wait()的作用是让当前线程进入等待状态,同时,wait()也会让当前线程释放它所持有的锁。而notify()和notifyAll()的作用,则是唤醒当前对象上的等待线程;notify()是唤醒单个线程,而notifyAll()是唤醒所有的线程。


wait, notify 和 notifyAll,这些在多线程中被经常用到的保留关键字,在实际开发的时候很多时候却并没有被大家重视。本文对这些关键字的使用进行了描述。

在 Java 中可以用 wait、notify 和 notifyAll 来实现线程间的通信。。举个例子,如果你的Java程序中有两个线程——即生产者和消费者,那么生产者可以通知消费者,让消费者开始消耗数据,因为队列缓冲区中有内容待消费(不为空)。相应的,消费者可以通知生产者可以开始生成更多的数据,因为当它消耗掉某些数据后缓冲区不再为满。

我们可以利用wait()来让一个线程在某些条件下暂停运行。例如,在生产者消费者模型中,生产者线程在缓冲区为满的时候,消费者在缓冲区为空的时候,都应该暂停运行。如果某些线程在等待某些条件触发,那当那些条件为真时,你可以用 notify 和 notifyAll 来通知那些等待中的线程重新开始运行。不同之处在于,notify 仅仅通知一个线程,并且我们不知道哪个线程会收到通知,然而 notifyAll 会通知所有等待中的线程。换言之,如果只有一个线程在等待一个信号灯,notify和notifyAll都会通知到这个线程。但如果多个线程在等待这个信号灯,那么notify只会通知到其中一个,而其它线程并不会收到任何通知,而notifyAll会唤醒所有等待中的线程。

package com.test.thread;

class TestThread extends Thread{

    public TestThread(String name) {
        super(name);
    }

    public void run() {
        synchronized (this) {
            System.out.println(Thread.currentThread().getName()+"notify_唤醒监视器等待的单个线程");
            notify();
        }
    }
}

public class Wait_Notify_Test {
    public static void main(String[] args) {

    	TestThread t1 = new TestThread("t1");
        synchronized(t1) {
            try {
                System.out.println(Thread.currentThread().getName()+"开始执行!!!");
                t1.start();

                
                System.out.println(Thread.currentThread().getName()+"进入等待状态");
                t1.wait();

                System.out.println(Thread.currentThread().getName()+" continue");
                
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}


Java多线程____wait(), notify(), notifyAll()等方法介绍_数据



//==============wait 和notifyAll()


package com.test.thread;


public class Wait_NotifyALL_Test {

    private static Object object = new Object();
 
 
	    public static void main(String[] args) {
	    	
	    	TestThread t1 = new TestThread("t1");
	    	TestThread t2 = new TestThread("t2");
	    	TestThread t3 = new TestThread("t3");
	        t1.start();
	        t2.start();
	        t3.start();
	
	        try {
	            System.out.println(Thread.currentThread().getName()+"__线程休眠2秒");
	            Thread.sleep(2000);
	        } catch (InterruptedException e) {
	            e.printStackTrace();
	        }
	
	        synchronized(object) {
	            System.out.println(Thread.currentThread().getName()+"__唤醒所有的等待的线程让他们 去竞争");
	            object.notifyAll();
	        }
	    }

	    static class TestThread extends Thread{
	        public TestThread(String name){
	            super(name);
	        }
			public void run() {
				synchronized (object) {
					System.out.println(Thread.currentThread().getName() + "__线程进入等待...");
					try {
						object.wait();
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
					System.out.println(Thread.currentThread().getName()	+ "__唤醒成功执行");
				}
			}
	    }
    
    
    
}


Java多线程____wait(), notify(), notifyAll()等方法介绍_数据_02




标签:Java,Thread,notifyAll,线程,notify,多线程,TestThread,wait
From: https://blog.51cto.com/ratelcloud/7454362

相关文章

  • java安全架构____Hmac秘钥加密自己的摘要数据
    importjavax.crypto.KeyGenerator;importjavax.crypto.Mac;importjavax.crypto.SecretKey;importjavax.crypto.spec.SecretKeySpec;importorg.apache.commons.codec.binary.Base64;/***@authorAdministratorHMACutil*/publicclassHmacUtil{ private......
  • java安全架构____对称加密和非对称加密区别(对称秘钥,非对称秘钥)
    (一)对称加密(SymmetricCryptography)对称加密是最快速、最简单的一种加密方式,加密(encryption)与解密(decryption)用的是同样的密钥(secretkey),这种方法在密码学中叫做对称加密算法。对称加密通常使用的是相对较小的密钥,一般小于256bit。因为密钥越大,加密越强.例如AES,DES(二)......
  • Java安全架构____KeyGenerator(对称)秘钥生成工具详解
    packagecom.ryx.frame.security.aes;importjava.security.SecureRandom;importjava.util.Date;importjavax.crypto.KeyGenerator;importjavax.crypto.SecretKey;importorg.apache.commons.codec.binary.Base64;publicclassKeyGeneral{ /** *AES128,256......
  • java安全架构____读取.cer证书文件的信息
    importjava.io.FileInputStream;importjava.security.cert.CertificateFactory;importjava.security.cert.X509Certificate;/***@authorGod*随便找一个.cer文件读取即可*/publicclassCertUtil{ /** *@authorGod *@cerPathJava读取Cer证书信息 *@th......
  • Java字符画生成工具
    生成工具如果让我们手工的来编辑这些字符画,显然是一件非常困难的差事。所以,我们可以借助下面这些工具,轻松地根据文字或图片来生成用于Banner输出的字符画。http://patorjk.com/software/taaghttp://www.network-science.de/ascii/http://www.degraeve.com/img2txt.ph......
  • 61基于java的学生考勤管理系统设计与实现(可参考做毕业设计)
    本章节给大家带来一个基于java学生考勤管理系统设计与实现,可适用于学生考勤系统,校园考勤,大学考勤管理,企业考勤系统,公司考勤系统,学校考勤系统。引言本文首先介绍了学生考勤管理系统的研究背景与意义,其次介绍了系统的总体功能设计,接着将对系统规划好的总体功能拆分成了各个功能子......
  • java数据结构与算法_____选择排序
    importjava.util.Arrays;/***@authorGod*选择排序(Selectionsort)是一种简单直观的排序算法。*它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,*存放在序列的起始位置,直到全部待排序的数据元素排完。*选择排序是不稳定的排序方法(比如序列[5,5,3......
  • Java安全管理____Java通过Https链接读取证书基本信息
    importjava.net.URL;importjava.security.SecureRandom;importjava.security.cert.Certificate;importjava.security.cert.CertificateException;importjava.security.cert.X509Certificate;importjavax.net.ssl.HostnameVerifier;importjavax.net.ssl.HttpsURL......
  • Java数据类型详细总结
    ......
  • Java树形菜单_轻量级js树形插件_jsTree树形插件
    //插件效果//代码<!DOCTYPEhtml><html><head><title>JS轻量级树形插件</title><metacharset="utf-8"><linkrel="stylesheet"href="https://cdnjs.cloudflare.com/ajax/libs/jstree/3.2.1/themes/def......