`

理解notify与wait在线程里面的使用

 
阅读更多

public class MultiThread {

 /**
  * @param args
  */
 public static void main(String[] args) {
  // TODO Auto-generated method stub 8
  new Thread(new Thread1()).start();
  try {
   Thread.sleep(1000);
  } catch (InterruptedException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
  new Thread(new Thread2()).start();  
 }
 
 
 private static class Thread1 implements Runnable
 {

  
  public void run() {
   // TODO Auto-generated method stub
//由于这里的Thread1和下面的Thread2内部run方法要用同一对象作为监视器,我们这里不能用this,因为在Thread2里面的this和这个Thread1的this不是同一个对象。我们用MultiThread.class这个字节码对象,当前虚拟机里引用这个变量时,指向的都是同一个对象。
   synchronized (MultiThread.class) {

    System.out.println("enter thread1...");
    
    System.out.println("thread1 is waiting");
    try {
   //释放锁有两种方式,第一种方式是程序自然离开监视器的范围,也就是离开了synchronized关键字管辖的代码范围,另一种方式就是在synchronized关键字管辖的代码内部调用监视器对象的wait方法。这里,使用wait方法释放锁。
     MultiThread.class.wait();
    } catch (InterruptedException e) {
     // TODO Auto-generated catch block
     e.printStackTrace();
    }
    
    System.out.println("thread1 is going on...");
    System.out.println("thread1 is being over!");   
   }
  }
  
 }
 
 private static class Thread2 implements Runnable
 {

 
  public void run() {
   // TODO Auto-generated method stub
   synchronized (MultiThread.class) {
   
    System.out.println("enter thread2...");
    
    System.out.println("thread2 notify other thread can release wait status..");
//由于notify方法并不释放锁, 即使thread2调用下面的sleep方法休息了10毫秒,但thread1仍然不会执行,因为thread2没有释放锁,所以Thread1无法得不到锁。

    MultiThread.class.notify();
    
    System.out.println("thread2 is sleeping ten millisecond...");
    try {
     Thread.sleep(1000);
    } catch (InterruptedException e) {
     // TODO Auto-generated catch block
     e.printStackTrace();
    }
    
    System.out.println("thread2 is going on...");
    System.out.println("thread2 is being over!");
    
   }
  }
  
 } 

}

注解:wait()使进同步方法的线程战时让出锁 放在锁吃池里面,让其他线程去竞争。当其他线程调用notify()唤醒调用过wait()方法的线程,如果此时notify线程后面还有代码那么久先执行此线程后面的代码,然后执行以前调用过wait()方法的线程
 

  • 大小: 5.5 KB
分享到:
评论

相关推荐

    深入理解Wait、Notify和Wait与sleep区别

    在Java编程语言中,多线程是...总之,理解和熟练掌握`wait()`, `notify()`以及`sleep()`的使用对于编写高效的多线程程序至关重要。在设计并发程序时,应根据需求选择合适的方法,确保线程间的协同工作和程序的正确性。

    41.线程间的通信-wait与notify-只唤醒一个线程或所有线程.mp4

    在学习Java过程中,自己收集了很多的Java的学习资料,分享给大家,有需要的欢迎下载,希望对大家有用,一起学习,一起进步。

    java中几个notify、wait使用实例

    在Java的多线程编程中,`notify()`与`wait()`是实现线程间通信的重要方法,它们主要用于解决生产者消费者问题、读者写者问题等典型同步问题。这两个方法定义在`Object`类中,因此所有Java对象都可以作为锁来使用。在...

    Java多线程wait和notify

    在Java中,`wait()` 和 `notify()` 方法是实现线程间通信和协作的重要工具,它们属于 `java.lang.Object` 类,这意味着所有类都默认继承了这两个方法。本文将详细探讨如何使用 `wait()` 和 `notify()` 来控制子线程...

    42.线程间的通信-wait与notify-wait(long)的使用.mp4

    在学习Java过程中,自己收集了很多的Java的学习资料,分享给大家,有需要的欢迎下载,希望对大家有用,一起学习,一起进步。

    一个理解wait()与notify()的例子

    本文旨在解析一个具体的Java多线程示例代码,以帮助读者更好地理解`wait()`与`notify()`方法的作用及其实现机制。这两个方法是Java中实现线程间通信的重要手段之一,尤其在解决生产者消费者模型、读者写者问题等经典...

    主线程去控制子线程wait与notify

    在本文中,我们将深入探讨如何使用主线程来控制子线程的`wait()`和`notify()`操作,以及它们在并发编程中的作用。 首先,`wait()`方法会导致当前线程进入等待状态,直到其他线程调用同一个对象的`notify()`或`...

    java之wait,notify的用法([ 详解+实例 ])

    在Java多线程编程中,wait和notify是两个非常重要的方法,它们都是Object类的方法,用于线程之间的通信和同步。下面我们将详细解释wait和notify的用法。 wait方法 wait方法是Object类的一个方法,用于让当前线程...

    Java 同步方式 wait和notify/notifyall

    在Java中,`wait()`, `notify()`, 和 `notifyAll()` 是Java Object类的三个方法,它们在实现线程间通信和协作时扮演着关键角色。这些方法主要用于解决线程等待和唤醒的问题,是基于Java Monitor(监视器)模型的。 ...

    39.线程间的通信-wait与notify-wait方法自动释放锁与notify方法不会释放锁.mp4

    在学习Java过程中,自己收集了很多的Java的学习资料,分享给大家,有需要的欢迎下载,希望对大家有用,一起学习,一起进步。

    wait_notify_demo

    在Java中,`wait()`、`notify()`和`notifyAll()`方法都是与对象锁相关的,它们用于控制线程的同步。使用这些方法的前提是线程必须拥有对象的监视器,也就是对象锁。这是通过在synchronized块或方法中调用它们来实现...

    wait,notify等线程知识.pdf

    在调用wait()之前,线程必须已经获取了对象的锁,即wait()、notify()和notifyAll()都必须在`synchronized`代码块或方法中。 2. **notify()**: notify()方法用于唤醒一个正在等待同一对象监视器锁的线程。如果有多...

    浅谈java多线程wait,notify

    在本文中,我们将通过示例代码详细介绍Java多线程wait和notify的使用,帮助读者更好地理解和掌握这两个机制。 wait机制 在Java中,wait机制用于暂停当前线程的执行,并释放当前对象的锁,以便让其他线程获得锁并...

    源码—Java多线程5—死锁和wait notify notifyAll

    源码—Java多线程5—死锁和wait notify notifyAll

    Java多线程中wait、notify、notifyAll使用详解

    例如,在生产者-消费者模型中,生产者线程可以使用wait()方法等待消费者线程的唤醒,而消费者线程可以使用notify()或notifyAll()方法唤醒生产者线程。 wait、notify、notifyAll方法是Java多线程编程中非常重要的...

    Java 同步锁 wait notify 学习心得

    `wait`和`notify`通常与条件变量模式结合使用,以实现线程之间的协调。例如,在生产者-消费者模型中,生产者线程在向共享缓冲区添加元素时可能会调用`wait()`,直到有空闲空间可用。消费者线程在移除元素后会调用`...

    如何在Java中正确使用 wait, notify 和 notifyAll

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

    Java的sychronized、wait和notify范例

    在提供的压缩包文件`java_sychronization`中,可能包含了一些示例代码,用于演示如何在Java中使用`synchronized`关键字以及`wait()`和`notify()`方法。通过研究这些样例,你可以更深入地了解这些工具的用法和效果。...

    线程编程方面若标志指出线程应该挂起,便用wait()命其进入等待状态。若标志指出线程应当恢复,则用一个notify()重新启动线程。

    线程编程是多任务并发执行的关键技术,在Java中,线程的管理对于程序的高效运行至关重要。线程的创建可以通过两种方式...正确管理和同步线程,以及理解各种方法的使用场景,可以帮助开发者避免并发问题,提升程序性能。

Global site tag (gtag.js) - Google Analytics