`
xiang37
  • 浏览: 431715 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

多线程之wait与notify实现线程间通信

 
阅读更多

一个线程执行相加的操作,相加结束后,通知另一个线程打印。

 

 

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.xiva.baseKnowledge;

import java.util.concurrent.TimeUnit;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author Administrator
 */

public class MutiThread {

    public static int count = 0;
    //public static boolean mutex = true;

    public synchronized void print() {    
        System.out.println(count);
    }

    public synchronized void add(int i) {
        count = count + i;
        System.out.println("add");
    }

    public static void main(String[] args) {
        MutiThread mThread = new MutiThread();
        PrintThread pThread = new PrintThread(mThread);
        AddThread addThread = new AddThread(pThread);
        addThread.start();
        pThread.start();
    }
}

class  PrintThread extends Thread {

    private final MutiThread mThread;
    
    private volatile boolean startP = false;
    
    public PrintThread(MutiThread mThread) {
        this.mThread = mThread;
    }
    
    public MutiThread getMThread(){
        return this.mThread;
    }
    
    public synchronized void notifyPrint(){
      startP = true;
      notify();
    }
    
    public synchronized void print(){
        if(startP){
                mThread.print();
                startP = false;
        }
        else{
            try {
                wait();
            } catch (InterruptedException ex) {
                Logger.getLogger(AddThread.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }
    
    
    @Override
    public void run() {
        while (true) {
            print();
        }
    }
}

class AddThread extends Thread {

    private final PrintThread pThread;
    
    public AddThread(PrintThread pThread) {
        this.pThread = pThread;
    }
        
    @Override
    public void run() {
        for (int i = 1; i < 1000; i++) {
            try {
                //Thread.sleep(5000);
                TimeUnit.SECONDS.sleep(5);
            } catch (InterruptedException ex) {
                Logger.getLogger(MutiThread.class.getName()).log(Level.SEVERE, null, ex);
            }
            pThread.getMThread().add(i);
            pThread.notifyPrint();
        }
    }
}

 

调用notifyPrint方法通知另一个线程启动打印。

分享到:
评论

相关推荐

    Java多线程wait和notify

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

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

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

    Java 同步方式 wait和notify/notifyall

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

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

    在Java多线程编程中,`wait()`和`notify()`是两个非常重要的方法,它们用于线程间的协作和通信。这两个方法是Java语言中的Object类提供的,因此所有的对象都可以使用。在本文中,我们将深入探讨如何使用主线程来控制...

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

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

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

    这两个方法是Java中实现线程间通信的重要手段之一,尤其在解决生产者消费者模型、读者写者问题等经典同步问题时非常有用。 #### 代码分析 给出的代码示例包括两个类:`ThreadA`和`ThreadB`。`ThreadA`作为主程序...

    浅谈Java线程间通信之wait/notify

    Java线程间通信之wait/notify Java中的wait/notify/notifyAll可用来实现线程间通信,是Object类的方法,这三个方法都是native方法,是平台相关的,常用来实现生产者/消费者模式。 wait()方法将当前线程置于等待...

    wait_notify_demo

    `wait()`、`notify()`和`notifyAll()`是Java中的三个关键字,它们属于Object类的方法,主要用于线程间的通信,尤其在实现生产者消费者模式时发挥着重要作用。本文将深入探讨这些方法以及如何在实际场景中应用它们。 ...

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

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

    wait,notify等线程知识.pdf

    Java中的多线程协同工作是通过一系列的同步机制来实现的,其中wait、notify和notifyAll是基于对象监视器的同步原语。这些方法在Java的Object类中定义,主要用于线程间的通信和协作,确保资源的安全访问。下面将详细...

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

    首先,`wait()`, `notify()`和`notifyAll()`是Object类中的方法,它们主要用于线程间通信和协作。这些方法只能在同步环境中(如`synchronized`块或方法)使用,否则会抛出`IllegalMonitorStateException`。它们的...

    36.线程间的通信-wait与notify-不使用wait与notifty实现线程间通讯有什么问题.mp4

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

    38.线程间的通信-wait与notify-wait与notifty机制的实现.mp4

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

    java中几个notify、wait使用实例

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

    Java的sychronized、wait和notify范例

    它们主要用于线程间通信,配合`synchronized`使用。 1. `wait()`:让当前持有锁的线程释放锁,并进入等待池,直到其他线程调用`notify()`或`notifyAll()`唤醒该线程。调用`wait()`后,线程会释放持有的锁,进入等待...

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

     在 Java 中可以用 wait、notify 和 notifyAll 来实现线程间的通信。。举个例子,如果你的Java程序中有两个线程——即生产者和消费者,那么生产者可以通知消费者,让消费者开始消耗数据,因为队列缓冲区中有内容待...

    C++实现多线程通信

    线程间通信的关键在于数据共享。在C++中,可以使用全局变量、类的成员变量或者静态成员变量来实现在不同线程间的共享。但是,无保护的共享数据可能会引发竞态条件,导致不可预测的行为。因此,需要采取适当的同步...

    多线程通信ThreadDemo

    7. **BlockingQueue**:队列实现的一种,提供了线程安全的数据结构,可以用来实现线程间的通信和协作。例如,`ArrayBlockingQueue`、`LinkedBlockingQueue`和`PriorityBlockingQueue`。 8. **CompletableFuture**:...

    多线程系列相关的技术要点

    1. Java多线程学习(一)Java多...6. Java多线程学习(五)线程间通信知识点补充 7. Java多线程学习(六)Lock锁的使用 8. Java多线程学习(七)并发编程中一些问题 9. Java多线程学习(八)线程池与Executor 框架

Global site tag (gtag.js) - Google Analytics