精华内容
下载资源
问答
  • 多线程之线程的交互

    2019-11-29 19:26:27
    如何交互线程交互:通俗的说就是线程之间的交互通知。 如何交互:这里使用notify(),wait()。 notify(),是线程唤醒正在等待的当前这个同步对象的线程。 wait(), 是线程等待,同时暂时释放正在占有的对象。(注意”...

    今天学习了线程的交互,什么叫线程交互?如何交互?
    线程交互:通俗的说就是线程之间的交互通知。
    如何交互:这里使用notify(),wait()。
    notify(),是线程唤醒正在等待的当前这个同步对象的线程。
    wait(), 是线程等待,同时暂时释放正在占有的对象。(注意”占有“,是不是很熟悉,表示它是和线程同步一起的)。

    列子:有两个线程,处理同一个英雄。一个加血,一个减血。
    减血的线程,发现血量<=1,就停止减血,直到加血的线程为英雄加了血>=10,才可以继续减血。

    hero.java代码:

    public class Hero {
        private StringBuffer name;  //人物姓名
        private float hp;       //生命值
        private int damage;   //伤害值
    
        public Hero(StringBuffer name, float hp, int damage) {
            this.name = name;
            this.hp = hp;
            this.damage = damage;
        }
    
        public Hero() { }
        public StringBuffer getName() {
            return name;
        }
        public float getHp() {
            return hp;
        }
        public int getDamage() {
            return damage;
        }
    
    /*使用synchronized 进行修饰,表示方法是线程安全*/
        //加血
        public synchronized  void recovery() {
            if(hp>=10){
                System.out.println("补充完毕!");
                System.out.printf("recovery:当前hero:%s,hp值为%.0f%n", name, hp);
                // 通知那些等待在this对象上的线程,可以醒过来了
                this.notify();
            }
            else {
                this.hp =this. hp + 2;
            }
    
        }
    
       //攻击,减血
        public synchronized  void attack() {
            if (hp<=1){
                System.out.println("hp值 已经不足,请补充");
                try {
                    //当hp值小于等于 1 时,等待。
                    this.wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
           this.hp = this.hp -3;
            System.out.printf("attack:当前hero:%s,hp值为%.0f%n", name, hp);
        }
    
    }
    
    

    TestThread.java 代码:

    public class WaitAndNotify {
        public static void main(String[] args) {
            final Hero h1 = new Hero(new StringBuffer("达摩"), 18.0f, 150);
    
            Thread t1 = new Thread(){
                public  void run(){
                    while(true){
                        try {
                            Thread.sleep(1000);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                        //减血
                        h1.attack();
                    }
                }
            };
            t1.start();
    
            Thread t2 = new Thread(){
                public  void run(){
                    while(true){
                        try {
                            Thread.sleep(1000);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                        //加血
                       h1.recovery();
                    }
                }
            };
            t2.start();
    
        }
    }
    

    结果:
    在s这里插入图片描述

    以上就是写的代码了,里面最主要的是 wait(),notify()。wait()线程暂时释放对象,进行等待,notify()进行唤醒正在等待的当前这个同步对象的线程。

    补充:
    关于notify()与notifyAll():
    1,其实wait(),notify()不是Tread里面的方法,他们来自于Object。所有的对象(Object)都可以被称为同步对象,所以也可以说它们是同步对像上的方法。
    2,notify(),是提醒或者说是唤醒 当前占有该同步对象的线程,notifyAll()是唤醒 当前占有该同步对象的所有线程 。

    展开全文
  • https://www.cnblogs.com/linjiqin/p/3208901.html 多线程之间如何进行信息交互 https://blog.csdn.net/calledWWW/article/details/79336252
    展开全文
  • 一个winform中,比如订阅了3个消息用以处理3个硬件返回的结果,h.value为硬件返回的某一数值。 消息1: h1.value { 处理函数1(); } 消息2: h2.value { 处理函数2(); } 消息3: h3.value ...
  • 多线程之间如何进行信息交互

    千次阅读 2018-02-19 02:18:23
    Object中的wait、notify和notifyAll方法。 ReenterantLock得到的Condition中的await、signal和signalAll方法。
    1. Object中的wait、notify和notifyAll方法。
    2. ReenterantLock得到的Condition中的await、signal和signalAll方法。
    展开全文
  • C#多线程编程实例 线程与窗体交互源码,该示例演示如何在线程安全的模式下调用Windows窗体上的控件。
  • 线程交互

    千次阅读 2011-09-08 01:24:14
    一个线程一般只有一把锁,那么多线程之间势必会发生联系或者程序中的一把锁被... 所谓线程的交互就是程序里唯一的synchronized是如何多线程之间进行传递的。 在交互中主要用到的方法: Public void wait() :导致
          一个线程一般只有一把锁,那么多线程之间势必会发生联系或者程序中的一把锁被一个线程获得之后,其它线程是否真的就处于阻塞状态不在执行了呢?答案当然是否定的,那么这一把锁该如何在多线程之间来回交替使用呢?下面就是线程之间的交互了。
    

          所谓线程的交互就是程序里唯一的synchronized是如何在多线程之间进行传递的。

    在交互中主要用到的方法:

    Public void wait() :导致当前的正在运行的线程等待,直到其他线程调用此对象的 notify() 方法或notifyAll() 方法。

    Public void wait(long timeout) :导致当前的线程等待,直到其他线程调用此对象的 notify() 方法或 notifyAll() 方法,或者超过指定的时间量。
    public void wait(long timeout, int nanos) :导致当前的线程等待,直到其他线程调用此对象的 notify() 方法或 notifyAll() 方法,或者其他某个线程中断当前线程,或者已超过某个实际时间量。

    void notify() :唤醒在此对象监视器上等待的单个线程。

    void notifyAll():唤醒在此对象监视器上等待的所有线程。

    注意:

    1.线程不能调用对象上等待或通知的方法,除非它拥有那个对象的锁。

    2.Wait(),notify(),notifyAll()在同步环境变量中调用。

    3.XX.wait(),XX.notify(),XX.notifyAll()中的XX指的是监视器而不是对象。Wait停止进行的是其所者的主线程。

    下面是一段两线程交互的代码:

       public class ThreadA {
        public static void main(String[] args) {
            ThreadB b = new ThreadB();
            //启动计算线程
            b.start();
            //线程A拥有b对象上的锁。线程为了调用wait()或notify()方法,该线程必须是那个对象锁的拥有者
            synchronized (b) {
                try {
                    System.out.println("等待对象b完成计算。。。");
                    //当前线程A等待
                    b.wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("b对象计算的总和是:" + b.total);
            }
        }
    }

     

    /**
    * 计算1+2+3 ... +100的和
    */
    public class ThreadB extends Thread {
        int total;

        public void run() {
            synchronized (this) {
                for (int i = 0; i < 101; i++) {
                    total += i;
                }
                //(完成计算了)唤醒在此对象监视器上等待的单个线程,在本例中线程A被唤醒
                notify();
            }
        }
    }

    注意:当在对象上调用wait()方法时,执行该代码的线程立即放弃它在对象上的锁。然而调用notify()时,并不意味着这时线程会放弃其锁。如果线程仍然在完成同步代码,则线程在移出之前不会放弃锁。因此,只要调用notify()并不意味着这时该锁变得可用。

     

    展开全文
  • 我想关于这个话题已经有很前辈讨论过了。今天算是一次学习总结吧。 在android的设计思想中,为了确保用户顺滑的操作体验。一些耗时的任务不能够在UI线程中运行,像访问网络就属于这类任务。因此我们必须要重新...
  • Python 多线程 Thread(一):如何构造新的线程 Python 多线程 Thread(二):Thread 类的几种方法 Python 的 Threading 类本身没有暂停,停止的控制方法,要实现这些功能的话可以在run方法中添加一系列的 标志...
  • 回答这个问题之前需要先了解java多线程的运行机制,线程间通信机制,线程同步问题。 这个问题我知道的实现方案有两种,一种是基于synchronized和wait/notify,另外一种是基于Lock和Condition. 1.基于synchronized...
  • sun 多线程编程指南

    2018-03-05 15:48:03
    sun主机经典多线程文档,描述了多线程如何交互、通信,block等一系列的api接口。是其他主机系统多线程的开山书籍
  • 如何在Vrep与VS交互中使用多线程? 一. 前言 ​ 本文主要内容为在VS中以C++调用Windows提供的API,来实现Vrep与VS交互过程中的多线程效果。详细实现思路及步骤在第三部分中。 二.为什么想使用多线程 ​ 实际工程中...
  • 多线程如何操控窗体? 里面说的很清楚了.对想深入了解多线程的人是有帮助的.
  • 1. 线程与界面组件需要注意的地方 在QThread线程中不能直接创建QWidget之类的界面组件. 因为在QT中,所有界面组件相关的操作都必须在主线程中(也就是GUI thread) 所以, QThread线程不能直接操作...将多线程类对...
  • 多线程交互、RCP、事物控制、数据倾斜、HBase数据同步性 TODO List thread.join()如何互相之间通知? 线程池何时最后运行完成? MemCache性能要优于Redis,因为使用了多线程; Spring源码; HashMap,HashTable...
  • 1. 线程与界面组件需要注意的地方 在QThread线程中不能直接创建QWidget之...2.QThread线程如何操作界面组件-方法1 将多线程类对象封装为GUI界面类的类成员 然后在子线程定义信号函数,通过信号槽机制,向界面组...
  • 在上文中我们学习了线程与进程,那么python中是如何处理的? 先看下单进程执行的情况 import time def run(n): print("task ",n ) time.sleep(2) run("t1") run("t2") 在上面...
  • Java线程之间的通信由jmm控制,jmm(Java memory module)决定一个线程对共享变量的写入何时对另一个线程可见。 线程之间的共享变量储存在...而jmm通过控制主内存与线程本地内存交互,来控制Java线程之间的通信。 ...
  • JAVA多线程

    2021-04-01 17:07:45
    线程交互多线程JAVA程序写一个多线程java程序线程模板启动多线程线程调度线程调度不确定性共享资源控制共享数据访问控制synchronized如何发挥作用?线程交互线程的运行时状态线程状态变化线程调度应当与业务结合单...
  • 多线程在各种编程语言中都是难点,很多语言中实现起来很麻烦,objective-c虽然...这篇文章主要从线程创建与启动、线程的同步与锁、线程的交互、线程池等等四个方面简单的讲解一下iphone中的多线程编程。 一、线程创
  • 多线程在各种编程语言中都是难点,很多语言中实现起来很麻烦,...这篇文章主要从线程创建与启动、线程的同步与锁、线程的交互、线程池等等四个方面简单的讲解一下iphone中的多线程编程。 一、线程创建与启动
  • Android中后台线程如何与UI线程交互 我想关于这个话题已经有很前辈讨论过了。今天算是一次学习总结吧。 在android的设计思想中,为了确保用户顺滑的操作体验。一些耗时的任务不能够在UI线程中运行,像访问...
  • 线程交互-> wait notify

    2015-08-23 19:07:00
    1、涉及多线程共享数据操作时,除了同步问题之外,还会遇到另一类问题:如何控制相互交互的线程之间的交互进度。 举例来说:有两个人,一个在洗碗,一个在擦碗,洗碗的碗放到架子上,如果架子是空的,则擦碗的人...
  • 多线程在各种编程语言中都是难点,很多语言中实现起来很麻烦,objective-...这篇文章主要从线程创建与启动、线程的同步与锁、线程的交互、线程池等等四个方面简单的讲解一下iphone中的多线程编程。 一、线程创建与启动

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 954
精华内容 381
关键字:

多线程如何交互