java 多线程 day04 线程通信

package com.czbk.thread;

/** * Created by chengtao on 17/12/3. *  需求: 子线程先运行10次,然后主线程运行 100次,依次运行50次 *         wait():  等待   如果线程执行了wait方法,那么该线程会进入等待的状态,等待状态下的线程必须要被其他线程调用notify方法才能唤醒。         notify(): 唤醒    唤醒线程池等待线程其中的一个。         notifyAll() : 唤醒线程池所有等待 线程。

wait与notify方法要注意的事项:         1. wait方法与notify方法是属于Object对象 的。         2. wait方法与notify方法必须要在同步代码块或者是同步函数中才能 使用。不在同步代码里执行,会报错         3. wait方法与notify方法必需要由锁对象调用。

wait():一个线程如果执行了wait方法,那么改线程就会进入一个以锁对象为标识符的线程池中等待。         此时 线程释放了锁,进入“临时阻塞”状态,并在其他线程调用notify方法才能将其唤醒,         唤醒后的该线程是“可 运行”状态,获得到cpu后即可执行。         Notify():如果一个线程执行notify方法,那么就会唤醒以锁对象为标识符的线程池中等待线程中的其中一个。         锁对象是Object 对象;         只有同步代码块或同步方法中才有锁;         线程池是以锁为标识符建立的 */

import java.util.concurrent.atomic.AtomicInteger;

public class Thread04_TraditionalThread_Communication {    public static void main(String[] args) {

final Business business = new Business();        new Thread(                new Runnable() {                    public void run() {

for(int i=1;i<=50;i++){                            business.sub(i);                        }

}                }        ).start();

for(int i=1;i<=50;i++){            business.main(i);        }

}

}class Business {    private boolean bShouldSub = true;    public synchronized void sub(int i){        while(!bShouldSub){            try {                this.wait();            } catch (InterruptedException e) {                e.printStackTrace();            }        }        for(int j=1;j<=10;j++){            System.out.println("sub thread sequence of " + j + ",loop of " + i);        }        bShouldSub = false;        this.notify();    }

public synchronized void main(int i){        while(bShouldSub){            try {                this.wait();            } catch (InterruptedException e) {                e.printStackTrace();            }        }        for(int j=1;j<=100;j++){            System.out.println("main thread sequence of " + j + ",loop of " + i);        }        bShouldSub = true;        this.notify();    }}
时间: 2024-10-09 06:08:35

java 多线程 day04 线程通信的相关文章

Java多线程之线程通信

线程通信的例子:使用两个线程打印 1-100,线程1.线程2交替打印.涉及到的三个方法:wait():一旦执行此方法,当前线程就进入阻塞状态,并释放同步监视器.notify():一旦执行此方法,就会唤醒被wait的一个线程.如果有多个线程被wait,就唤醒优先级高的那个.notifyAll():一旦执行此方法,就会唤醒所有被wait的线程. 说明:1.wait(),notify(),notifyAll()三个方法必须使用在同步代码块或同步方法中.2.wait(),notify(),notifyA

Java多线程之线程的通信

Java多线程之线程的通信 在总结多线程通信前先介绍一个概念:锁池.线程因为未拿到锁标记而发生的阻塞不同于前面五个基本状态中的阻塞,称为锁池.每个对象都有自己的锁池的空间,用于放置等待运行的线程.这些线程中哪个线程拿到锁标记由系统决定.前面我们也有T到死锁的概念,线程互相等待其他线程释放锁标记,而又不释放自己的:造成无休止地等待.当出现死锁的时候,我们应该如何解决呢?通过线程间的通信解决. 线程间通信: 多线程之间的通信有2种方式,第一种是使用object类的几个方法,第二种是使用条件变了来控制

关于Java多线程的线程同步和线程通信的一些小问题(顺便分享几篇质量高的博文)

Java多线程的线程同步和线程通信的一些小问题(顺便分享几篇质量高的博文) 前言:在学习多线程时,遇到了一些问题,这里我将这些问题都分享出来,同时也分享了几篇其他博客主的博客,并且将我个人的理解也分享给大家. 一.对于线程同步和同步锁的理解(注:分享了三篇高质量的博客) 以下我精心的挑选了几篇博文,分别是关于对线程同步的理解和如何选择线程锁以及了解线程锁的作用范围. <一>线程同步锁的选择 1. 这里我推荐下Java代码质量改进之:同步对象的选择这篇博文. 2. 以上推荐的博文是以卖火车票为例

java笔记--关于线程通信

关于线程通信 使用多线程编程的一个重要原因就是线程间通信的代价比较小 --如果朋友您想转载本文章请注明转载地址"http://www.cnblogs.com/XHJT/p/3897773.html "谢谢-- 关键技术: yield(): Thread类的一个静态方法,用来暂停当前正在执行的线程对象,并执行其他线程 public static void yield(){} 代码实例: 实现线程间的发送和接收消息 package com.xhj.thread; /** * 线程之间的通信

JAVA多线程之线程间的通信方式

一,介绍 本总结我对于JAVA多线程中线程之间的通信方式的理解,主要以代码结合文字的方式来讨论线程间的通信,故摘抄了书中的一些示例代码. 二,线程间的通信方式 ①同步 这里讲的同步是指多个线程通过synchronized关键字这种方式来实现线程间的通信. 参考示例: public class MyObject { synchronized public void methodA() { //do something.... } synchronized public void methodB()

java多线程之间的通信

如何让两个线程依次执行?那如何让 两个线程按照指定方式有序交叉运行呢?四个线程 A B C D,其中 D 要等到 A B C 全执行完毕后才执行,而且 A B C 是同步运行的三个运动员各自准备,等到三个人都准备好后,再一起跑子线程完成某件任务后,把得到的结果回传给主线程1.如何让两个线程依次执行?#Copypublic static void main(String[] args) {demo1();/结果: t1>>pirnt:1t2>>pirnt:1t2>>pir

Java多线程之线程结束清理

该事例说明了清理工作必须要放在finally块中 package Thread.Interrupting; import java.util.concurrent.TimeUnit; class NeedsCleanup { private final int id; public NeedsCleanup(int ident) { id = ident; System.out.println("NeedsCleanup " + id); } public void cleanup()

Java多线程之线程中断

该例子说明,Sleep可以被中断,但是I/O和synchronized不能被中断. package Thread.Interrupting; import java.io.IOException; import java.io.InputStream; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; imp

java多线程之线程的同步与锁定(转)

一.同步问题提出 线程的同步是为了防止多个线程访问一个数据对象时,对数据造成的破坏. 例如:两个线程ThreadA.ThreadB都操作同一个对象Foo对象,并修改Foo对象上的数据. publicclass Foo { privateint x = 100; publicint getX() { return x;     } publicint fix(int y) {         x = x - y; return x;     } } publicclass MyRunnable i