• 线程之间的通讯


    package com;

    /*
    * 生产类
    */
    public class Producer implements Runnable {
    //开始操作数据存储类P
    P q = null;

    public Producer(P q){
    this.q = q;
    }

    @Override
    public void run() {
    int i = 0;

    while(true){
    //编写往数据存储空间放入数据的代码
    if( i == 0 ){
    q.set("张三", "男");
    }else{
    q.set("李四", "女");
    }

    i = (i+1)%2;
    }
    }

    }

    package com;

    /*
    * 消费类
    */
    public class Consumer implements Runnable {
    //开始操作数据存储类P
    P q = null;

    public Consumer(P q){
    this.q = q;
    }

    @Override
    public void run() {
    while(true){
    //编写往数据存储空间取出数据的代码
    while( true ){
    q.get();
    }
    }
    }

    }

    package com;

    /*
    * 数据存储类
    */
    public class P {
    //数据存储空间
    private String name;
    private String sex;
    boolean bFull = false;//防止没有放入就不断读取或者没有取不断放入

    //加入set和get方法进行数据同步以免资源共享产生差异
    /*
    * wait(),notify(),notifyAll()方法只能在synchronized中调用
    */

    public synchronized void set(String name, String sex){
    if( bFull ){//正在放入,先等等
    try{
    wait();//后来的线程要等待
    }catch(InterruptedException e){

    }
    }

    this.name = name;

    try{
    Thread.sleep(10);
    }catch(Exception e){
    System.out.println(e.getMessage());
    }

    this.sex = sex;
    bFull = true;
    notify();//唤醒最先到达的线程
    }

    public synchronized void get(){
    if( !bFull ){//没有取,先等等
    try{
    wait();//后来的线程要等待
    }catch(InterruptedException e){

    }
    }

    System.out.println(this.name + "---->" + this.sex);
    bFull = false;
    notify();//唤醒最先到达的线程
    }
    }

    主类

    package com;

    public class ThreadCommunication {

    /**
    * 线程通讯
    */
    public static void main(String[] args) {
    P q = new P();
    new Thread(new Producer(q)).start();
    new Thread(new Consumer(q)).start();
    }

    }

  • 相关阅读:
    Codeforces 414A
    使用Homebrew在Mountain Lion上安装MySQL
    hdu2066:一个人的旅行(最短路)
    hdu2066:一个人的旅行(最短路)
    hdu1297:Children’s Queue(大数递推)
    hdu1297:Children’s Queue(大数递推)
    hdu1175: 连连看(bfs)
    hdu1175: 连连看(bfs)
    PID72 / 拔河比赛 (动态规划)
    PID72 / 拔河比赛 (动态规划)
  • 原文地址:https://www.cnblogs.com/xingmeng/p/2445545.html
Copyright © 2020-2023  润新知