线程的等待与唤醒,实现if...else里面的值交互依次输出

线程通信原理图:


  • 资源类:
package com.yonyou.sci.gateway.exec.threadnet;

public class Resource {
     String name;
     String sex;
     // 用于表示赋值后的成员变量值有没有被输出 或 赋值成功
     boolean flag = false;
}
  • 成员变量赋值类:
package com.yonyou.sci.gateway.exec.threadnet;

public class Input implements Runnable {

    private Resource r;

    public Input (Resource r) {
        this.r = r;
    }

    @Override
    public void run () {
        int i = 0;
        while (true) {
            synchronized (r) {
                // 如果 flag 为 true 说明变量 name、sex 已经成功赋值,还没有被输出
                if (r.flag) {
                    try {
                        r.wait();
                    }catch (Exception e){};
                }
                else {
                    if (i%2 == 0) {
                        r.name = "张三";
                        r.sex = "男";
                    }
                    else {
                        r.name = "xiaohong";
                        r.sex = "girl";
                    }
                    // 给变量 name、sex 赋值完成后,把 falg 标识更改为true
                    r.flag = true;
                    i++;
                    // 唤醒线程
                    r.notify();
                }
            }
        }
    }

}
  • 打印成员变量值:
package com.yonyou.sci.gateway.exec.threadnet;

public class Output implements Runnable {
    private Resource r;

    public Output (Resource r) {
        this.r = r;
    }

    @Override
    public void run () {
        while (true){
            synchronized (r){
                // 如果 flag 为 false 说明变量 name、sex 没有被赋值,等待变量赋值
                if (!r.flag) {
                    try{
                        r.wait();
                    }catch (Exception e){
                        e.getMessage();
                    };
                }
                else {
                    System.out.println(r.name+"........"+r.sex);
                    r.flag = false;
                    r.notify();
                }
            }
        }

    }
}
  • 启动线程类:
package com.yonyou.sci.gateway.exec.threadnet;

public class mainResource {
    public static void main(String[] args) {
        Resource r = new Resource();

        Input i = new Input(r);
        Output o = new Output(r);

        Thread t1 = new Thread(i);
        Thread t2 = new Thread(o);

        t1.start();t2.start();

    }
}

原文地址:https://www.cnblogs.com/tangshengwei/p/11735632.html

时间: 2024-10-09 02:36:05

线程的等待与唤醒,实现if...else里面的值交互依次输出的相关文章

Java线程的等待与唤醒

生产者和消费者必须使用同步代码块包裹起来,保证等待和唤醒只能有一个执行,同步使用的锁对象必须保证唯一 Thread中重要方法 void wait() 在其他线程调用此对象的notify()方法或notifyall()方法前,导致当前线程等待 void notify() 唤醒在此对象监视器上等待的单个线程后,会继续执行wait方法之后的代码 void notifyAll() 唤醒所有等待线程 void wait(long m)在毫秒结束之后,还没有被notify唤醒,就会自动醒来,线程睡醒进入到R

【线程系列三】线程的等待与唤醒机制

为了更高效的处理一些时间片短,任务量大的任务,我们可能会经常用到多线程.但是多线程的环境下,很容易出现线程并发问题,线程死锁就是很常见的一种并发问题.为了避免此类问题,我们会用到线程间的通信,而等待唤醒机制,就是线程间通信的一种形式. 等待唤醒机制用到的方法主要有: public final void wait() throws InterruptedException : 当前线程必须拥有此对象监视器.该线程发布对此监视器的所有权并等待,直到其他线程通过调用 notify 方法,或 notif

Java---18---多线程:等待唤醒机制

class Res { String name; String sex; } class Input implements Runnable { private Res r; public Input(Res r) { // TODO Auto-generated constructor stub this.r = r; } public void run() { int x = 0; while (true) { synchronized (r) { if (x == 0) { r.name

Java多线程5:线程等待与唤醒

原文:http://www.cnblogs.com/skywang12345/p/3479224.html wait(),notify(), notifyAll()等方法介绍在Object.java中,定义了wait(),notify()和notifyAll()等方法.wait()的作用是让当前线程进入等待状态,同时,wait()也会让当前线程释放它所持有的锁.而notify()和notifyAll()的作用,则是唤醒当前对象上的等待线程:notify()是唤醒单个线程,而notifyAll()

java 多线程—— 线程等待与唤醒

java 多线程 目录: Java 多线程——基础知识 Java 多线程 —— synchronized关键字 java 多线程——一个定时调度的例子 java 多线程——quartz 定时调度的例子 java 多线程—— 线程等待与唤醒 概述 第1部分 wait(), notify(), notifyAll()等方法介绍 第2部分 wait()和notify()示例 第3部分 wait(long timeout)和notify() 第4部分 wait() 和 notifyAll() 第5部分 

线程中的等待与唤醒

上一篇文章讲到join()方法的时候,用到了一个函数即为yield()方法,它的作用是将cup让与具有相同优先级的线程去使用.本篇文章就为大家讲述线程中的一些关于等待和唤醒的函数. sleep(): 使当前线程暂停使用一段时间,让其它线程继续有机会执行,但是它并不释放对象锁,也就是说有synchronized关键字的时候,其它线程仍然不能访问其共享资源.sleep()方法需要用户去设置阻塞的时间.在用户设置sleep()方法的时候,该线程一定是不会被执行的,所以会让优先级低的线程有机会去执行.也

Java多线程系列---“基础篇”05之 线程等待与唤醒

转自:https://www.cnblogs.com/skywang12345/p/3479224.html  (含部分修改) 概要 本章,会对线程等待/唤醒方法进行介绍.涉及到的内容包括: wait(), notify(), notifyAll()等方法介绍 wait()和notify() wait(long timeout)和notify() wait() 和 notifyAll() 为什么notify(), wait()等函数定义在Object中,而不是Thread中 一. wait(),

Android-Java多线程通讯(生产者 消费者)&10条线程对-等待唤醒/机制的管理

上一篇博客 Android-Java多线程通讯(生产者 消费者)&等待唤醒机制 是两条线程(Thread-0 / Thread-1) 在被CPU随机切换执行: 而今天这篇博客是,在上一篇博客Android-Java多线程通讯(生产者 消费者)&等待唤醒机制 的基础上,扩大规模增加10条线程去执行 生产者 消费者: 注意:?? 上一篇博客是两条线程在执行(生产者 消费者)例如:当Thread-0 锁.wait(); 等待 冻结后,  Thread-1 锁.notify(); 唤醒的一定是 T

等待与唤醒机制(线程之间的通信)

线程间通信 概念:多个线程在处理同一个资源,但是处理的动作(线程的任务)却不相同. 为什么要处理线程间通信 多个线程并发执行时, 在默认情况下CPU是随机切换线程的,当我们需要多个线程来共同完成一件任务,并且我们 希望他们有规律的执行, 那么多线程之间需要一些协调通信,以此来帮我们达到多线程共同操作一份数据. 如何保证线程间通信有效利用资源: 多个线程在处理同一个资源,并且任务不同时,需要线程通信来帮助解决线程之间对同一个变量的使用或操作. 就是多个线程在操作同一份数据时, 避免对同一共享变量的