java 多线程(wait/notify/notifyall)

package com.example;

public class App {
    /* wait\notify\notifyAll 都属于object的内置方法
     * wait:            持有该对象的线程把该对象的控制权交出
      notify:            通知某个正在等待该对象控制权的线程可以继续运行
      notifyAll:        通知所有等待该对象控制权的线程继续运行 */
    public static void main(String[] args) {

        MyThread mt = new MyThread();
        mt.start();
        //调用wait时,必须保证对该对象具有控制权,因此需要加synchronized
        synchronized(mt){
            try {
                mt.wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

            System.out.println(mt.total);
        }
    }
}
package com.example;

public class MyThread extends Thread {
    int total = 0; 

    public void run() {
        //调用notify时,必须保证对该对象具有控制权,因此需要加synchronized
        synchronized (this) {
            for (int i = 0; i < 100; i++) {
                total += i;
            }
            notify();
        }
    }
}
时间: 2024-10-09 16:44:58

java 多线程(wait/notify/notifyall)的相关文章

Java多线程_wait/notify/notifyAll方法

关于这三个方法,我们可以查询API得到下列解释: wait():导致当前的线程等待,直到其他线程调用此对象的notify( ) 方法或 notifyAll( ) 方法或者指定的事件用完 notify():唤醒在此对象监视器上等待的单个线程 notifyAll():唤醒在此对象监视器上等待的所有线程 我们需要注意的点(1)wait().notify/notifyAll() 方法是Object的本地final方法,无法被重写. (2)wait() 与 notify/notifyAll 方法必须在同步

Java多线程--wait(),notify(),notifyAll()的用法

忙等待没有对运行等待线程的 CPU 进行有效的利用(而且忙等待消耗cpu过于恐怖,请慎用),除非平均等待时间非常短.否则,让等待线程进入睡眠或者非运行状态更为明智,直到它接收到它等待的信号. Java 有一个内建的等待机制来允许线程在等待信号的时候变为非运行状态.java.lang.Object 类定义了三个方法,wait().notify()和 notifyAll()来实现这个等待机制. 但在使用wait().notify()和 notifyAll()必须获取该对象的锁,否则的话会抛异常Ill

[转]java 为什么wait(),notify(),notifyAll()必须在同步方法/代码块中调用?

在 Java中,所有对象都能够被作为"监视器monitor"——指一个拥有一个独占锁,一个入口队列和一个等待队列的实体entity. 所有对象的非同步 方法都能够在任意时刻被任意线程调用,此时不需要考虑加锁的问题. 而对于对象的同步方法来说,在任意时刻有且仅有一个拥有该对象独占锁的线程能够调用它们.例如,一个同步方法是独占的.如果在线程调用某一对象的同步方法时,对象的独占锁被其他线程拥有,那么当前线程将处于阻塞状态,并添加到对象的入口队列中. 只有在调用线程拥有某个对象的独占锁时,才能

java多线程wait notify join

wait notify 几个注意点: wait 与 notify/notifyAll 方法必须在同步代码块中使用,即要先对调用对象加锁. 当线程执行wait()时,会把当前的锁释放,然后让出CPU,进入等待状态. 当执行notify/notifyAll方法时,会唤醒一个处于等待该 对象锁 的线程,然后继续往下执行,直到执行完退出对象锁锁住的区域(synchronized修饰的代码块)后再释放锁. 从这里可以看出,notify/notifyAll()执行后,并不立即释放锁,而是要等到执行完临界区中

java多线程wait,notify,countDownLatch的一些简单应用

第一次写,错的地方,希望大家指出,谢谢! wait ,notify都是Object中的方法: 1 ,他们必须配合synchronized关键字使用 2,wait方法释放锁,notify方法不释放锁 需求: 一个集合,2个线程,一个线程往集合中添加10个元素,另一个线程判断,如果集合中正好为5个元素时,就执行某段代码: 1 public class ListAdd2 { 2 3 private static List list = new ArrayList(); 4 public void ad

Java的wait(), notify()和notifyAll()使用心得(转)

本篇文章是对java的 wait(),notify(),notifyAll()进行了详细的分析介绍,需要的朋友参考下wait(),notify()和notifyAll()都是java.lang.Object的方法:wait(): Causes the current thread to wait until another thread invokes the notify() method or the notifyAll() method for this object.notify():

Java的wait(), notify()和notifyAll()使用心得

本篇文章是对java的 wait(),notify(),notifyAll()进行了详细的分析介绍,需要的朋友参考下. wait(),notify()和notifyAll()都是java.lang.Object的方法: wait(): Causes the current thread to wait until another thread invokes the notify() method or the notifyAll() method for this object. notify

Java Object 对象上的wait(),notify(),notifyAll()方法理解

第一阶段理解(2017-7-27): Java 将wait(),notify(),notifyAll()方法放在Object对象上,也就是说任何一个对象都可以调用这个方法,这与”任何一个对象都有一个内置锁,可以用于线程同步“是照应的.因此,当某个线程要释放cpu争夺权,让自己进入等待状态时,调用 某个锁(对象)上的wait()方法,也就是让当前线程等待其它线程调用该锁上的notify()或notify()方法.线程间通过同步锁来实现等待与唤醒协作.简单例子: 1 package com.lyyc

java基础知识回顾之java Thread类学习(七)--java多线程通信等待唤醒机制(wait和notify,notifyAll)

1.wait和notify,notifyAll: wait和notify,notifyAll是Object类方法,因为等待和唤醒必须是同一个锁,不可以对不同锁中的线程进行唤醒,而锁可以是任意对象,所以可以被任意对象调用的方法,定义在Object基类中. wait()方法:对此对象调用wait方法导致本线程放弃对象锁,让线程处于冻结状态,进入等待线程的线程池当中.wait是指已经进入同步锁的线程,让自己暂时让出同步锁,以便使其他正在等待此锁的线程可以进入同步锁并运行,只有其它线程调用notify方

Java多线程8:wait()和notify()/notifyAll()

轮询 线程本身是操作系统中独立的个体,但是线程与线程之间不是独立的个体,因为它们彼此之间要相互通信和协作. 想像一个场景,A线程做int型变量i的累加操作,B线程等待i到了10000就打印出i,怎么处理?一个办法就是,B线程while(i == 10000),这样两个线程之间就有了通信,B线程不断通过轮训来检测i == 10000这个条件. 这样可以实现我们的需求,但是也带来了问题:CPU把资源浪费了B线程的轮询操作上,因为while操作并不释放CPU资源,导致了CPU会一直在这个线程中做判断操