javaseday13

xiaoxiao2021-02-28  123

线程间通讯:多个线程在处理同一资源 ,但是任务不同

x++%2能实现 0 1 的切换

等待 唤醒机制

涉及的方法:

1、wait();  让线程处于冻结状态,被wait的线程会被存储到线程池中

2、notify(); 唤醒线程池中一个线程(任意)

3、notifyAll();唤醒线程池中的所有线程

输入不能new 因为要输出同个对象 还要用引用 所以传参进  Reasource r; 同时使用构造函数 传入

public class TestOra { public static void main(String[] args) { //创建资源  比如货物 Reasource r = new Reasource(); //创建任务 比如货车 Input in = new Input(r); Output out = new Output(r); //创建线程 执行路径 比如道路 Thread t1 = new Thread(in); Thread t2 = new Thread(out); t1.start(); t2.start(); } } class Input implements Runnable{ Reasource r ; Input (Reasource r){ this.r= r; } public void run() { int x=0; while (true) { synchronized(r) { //资源就是唯一锁 if(x==0) { r.name = "mike"; r.sex = "nan"; } else { r.name="bob"; r.sex="w"; } } x = (x+1)%2;//切换 输入进行测试 } } } class Output implements Runnable{ Reasource r ; Output(Reasource r){ this.r=r; } public void run() { while(true) { synchronized(r) { System.out.println(r.name+"..."+r.sex); } } } } class Reasource{ String name; String sex; }

这些方法度必须定义在同步中 因为这些方法是用于操作线程状态的方法

必须要明确到底操作的是哪个锁上的线程

为什么操作线程的方法 wait notify notifyall 定义在object 类中

因为这些方法是监视器的方法 监视器其实就是锁 线程池(等待集)

锁可以是任意的对象 任意的对象调用的方式一定定义在object类中

间隔输入就加上标志 和 wait() notify() 的应用

if(r.flag) { try { r.wait(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } }

r.flag=true; r.notify();

public class TestOra { public static void main(String[] args) { //创建资源  比如货物 Reasource r = new Reasource(); //创建任务 比如货车 Input in = new Input(r); Output out = new Output(r); //创建线程 执行路径 比如道路 Thread t1 = new Thread(in); Thread t2 = new Thread(out); t1.start(); t2.start(); } } class Input implements Runnable{ Reasource r ; Input (Reasource r){ this.r= r; } public void run() { int x = 0; while (true) { if (x == 0) { r.set("laomao", "nan"); } else { r.set("bob", "w"); } x = (x+1)%2;//切换 输入进行测试 } } } class Output implements Runnable { Reasource r; Output(Reasource r) { this.r = r; } public void run() { r.out(); } } class Reasource{ private String name; private String sex; private boolean flag=false; public synchronized void set(String name, String sex) { if(flag) { try { this.wait(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } this.name=name; this.sex=sex; flag = true; this.notify(); } } public synchronized void out() { if(!flag) { try { this.wait(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } System.out.println(name + "..." + sex); flag=false; this.notify(); } }

转载请注明原文地址: https://www.6miu.com/read-48631.html

最新回复(0)