• java线程通信


    用输入和输出两个线程对同一对象进行操作

      1 package javase;
      2 
      3 class Resource{
      4     private String name;
      5     private String sex;
      6     private boolean flag = true;
      7 
      8     public synchronized void set(String name,String sex) {
      9         this.name = name;
     10         this.sex = sex;
     11     }
     12     
     13     public boolean isFlag() {
     14         return flag;
     15     }
     16 
     17     public void setFlag(boolean flag) {
     18         this.flag = flag;
     19     }
     20 
     21     public synchronized void get() {
     22         System.out.println(name+"------"+sex);
     23     }
     24 }
     25 
     26 class Output implements Runnable{
     27 
     28     Resource r;
     29     public Output(Resource r) {
     30         super();
     31         this.r = r;
     32     }
     33     
     34     @Override
     35     public void run() {
     36         
     37         r.setFlag(true);
     38         while(true) {
     39             
     40             synchronized (r) {
     41                 if(r.isFlag()) {
     42                     r.get();
     43                     r.setFlag(false);
     44                     r.notify();
     45                 }
     46                 try {
     47                     r.wait();
     48                 } catch (InterruptedException e) {
     49                     e.printStackTrace();
     50                 }
     51                 
     52             }
     53         }
     54         
     55     }
     56     
     57 }
     58 
     59 class Input implements Runnable{
     60 
     61     private int x=0;
     62     Resource r;
     63     public Input(Resource r) {
     64         super();
     65         this.r = r;
     66     }
     67 
     68     @Override
     69     public void run() {
     70         
     71         while(true) {
     72             synchronized (r) {
     73                 
     74                 if(r.isFlag()) 
     75                     try {
     76                         r.wait();
     77                     } catch (InterruptedException e) {
     78                         e.printStackTrace();
     79                     }
     80                 if(x%2==0)
     81                     r.set("佩奇", "母猪");
     82                 else
     83                     r.set("乔治", "公猪");
     84                 x++;
     85                 r.setFlag(true);
     86                 r.notify();
     87             }
     88         }
     89         
     90     }
     91     
     92 }
     93 
     94 public class ResourceDemo {
     95 
     96     public static void main(String[] args) {
     97         
     98         Resource r = new Resource();
     99         Input in = new Input(r);
    100         Output out = new Output(r);
    101                 
    102         Thread t1 = new Thread(in);
    103         Thread t2 = new Thread(out);
    104         
    105         t1.start();
    106         t2.start();
    107         
    108     }
    109 
    110 }

    创建一个公用的对象给两个线程使用,一个为输入,一个为输出。当输入线程进入锁后会对对象元素进行赋值,唤醒锁对象线程池中的任意一个线程,然后使自己进入等待。此时输出线程拿到执行权,输出对象元素的值,再唤醒锁对象线程池中的任意一个线程,然后使自己进入等待。如此不断循环即可

    多生产者多消费者案例

      1 package javase;
      2 
      3 import java.util.concurrent.locks.Condition;
      4 import java.util.concurrent.locks.Lock;
      5 import java.util.concurrent.locks.ReentrantLock;
      6 
      7 class Resources{
      8     
      9     private String name;
     10     private int count = 1;
     11     private boolean flag = false;
     12     
     13     Lock lock = new ReentrantLock();
     14     
     15     Condition producer_con = lock.newCondition();
     16     Condition consumer_con = lock.newCondition();
     17     
     18     public void setName(String name) {
     19         
     20         lock.lock();
     21         try {
     22             while(flag)
     23                 try {
     24                     producer_con.await();
     25                 } catch (InterruptedException e) {
     26                     e.printStackTrace();
     27                 }
     28             
     29             this.name = name + count;
     30             System.out.println(Thread.currentThread().getName()+"--生产者--"+this.name);
     31             count++;
     32             flag = true;
     33             consumer_con.signal();
     34         }
     35         finally {
     36             lock.unlock();
     37         }
     38         
     39         
     40     }
     41     
     42     public void get() {
     43         
     44         lock.lock();
     45         try {
     46             while(!flag)
     47                 try {
     48                     consumer_con.await();
     49                 } catch (InterruptedException e) {
     50                     e.printStackTrace();
     51                 }
     52         
     53             System.out.println(Thread.currentThread().getName()+"----消费者--"+this.name);
     54             flag = false;
     55             producer_con.signal();
     56         }
     57         finally {
     58             lock.unlock();
     59         }
     60         
     61             
     62         
     63     }
     64     
     65 }
     66 
     67 class Consumer implements Runnable{
     68     
     69     private Resources r;
     70     public Consumer(Resources r) {
     71         super();
     72         this.r = r;
     73     }
     74 
     75     @Override
     76     public void run() {
     77         while(true)
     78             r.get();
     79     }
     80     
     81 }
     82 
     83 class Producer implements Runnable{
     84     
     85     private Resources r;
     86     public Producer(Resources r) {
     87         super();
     88         this.r = r;
     89     }
     90 
     91     @Override
     92     public void run() {
     93         while(true)
     94             r.setName("烤鸭");
     95     }
     96     
     97 }
     98 
     99 public class ProducerConsumerDemo {
    100 
    101     public static void main(String[] args) {
    102         
    103         Resources r = new Resources();
    104         
    105         Producer p = new Producer(r);
    106         Consumer c = new Consumer(r);
    107         
    108         Thread t0 = new Thread(p);
    109         Thread t1 = new Thread(p);
    110         Thread t2 = new Thread(c);
    111         Thread t3 = new Thread(c);
    112         
    113         t0.start();
    114         t1.start();
    115         t2.start();
    116         t3.start();
    117         
    118     }
    119 
    120 }

    生产者每生产一个,消费者就消费一次。用Lock lock = new ReentrantLock();创建锁对象,用其中的方法创建两个监视器,用于分别监视消费者和生产者。开启线程后,生产者生产之前每次都会检查是否有物品,若有则进入等待,同时唤醒消费者线程。若没有则进行生产。消费者消费之前每次都会检查是否有物品。若有则消费。若没有则进入等待,同时唤醒生产者线程。

  • 相关阅读:
    Spring Boot 2 快速教程:WebFlux 集成 Thymeleaf(五)
    Spring Boot 2 快速教程:WebFlux 集成 Mongodb(四)
    程序兵法:Java String 源码的排序算法(一)
    oracle等待事件以及解决方案
    记一次数据库参数compatible降级[转]
    R中统计假设检验总结(一)
    Kriging插值法
    数学建模小练习(1):插值【转】
    C++11 lambda表达式
    C++11 正则表达式——基础知识介绍
  • 原文地址:https://www.cnblogs.com/lsy-lsy/p/10921738.html
Copyright © 2020-2023  润新知