java线程之生产者与消费者

预习java线程的三种创建方式

package com.bj.thread;

import java.util.concurrent.*;

/**
 * @FileName: TestThread
 * @Remark:
 * @Author  
 * @Date 2022-03-14
 * @Version 1.0.0
 */
class TestMain{
    public static void main(String[] args) {
        // 第一种开启线程方法(静态代理的模式)
        Thread thread=new Thread(new TestThread(),"晓明开启的线程");
        thread.start();
        String name = thread.getName();
        System.out.println("第一个线程名称:"+name);
        // 第二种方法,继承的方式
        SecondThread secondThread=new SecondThread();
        secondThread.setName("这是第二个开启的线程。。。");
        secondThread.start();
        try {
            Thread.sleep(100);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("线程状态:"+ secondThread.getState()+"线程优先级:"+ secondThread.getPriority()+"线程名称:"+  secondThread.getName());
     // 第三种实现线程的方法
        try {
            // 线程池
            ExecutorService executorService = Executors.newFixedThreadPool(10);
            executorService.execute(new TestThread());
            executorService.execute(new TestThread());
            executorService.execute(new TestThread());
            executorService.execute(new TestThread());
            // 将来的线程用,Callable接口用submit
            Future submit = executorService.submit(new ThirdThread());
            FutureTask futureTask=new FutureTask(new ThirdThread());
            // 静态代理模式启动线程
            new Thread(futureTask).start();
            System.out.println("未来的任务:"+futureTask.get());
            System.out.println("将来的线程:"+submit.get());
            // 关闭连接
            executorService.shutdown();
        } catch (Exception e) {
            e.printStackTrace();
        }
//        Thread thirdThread=new Thread(new ThirdThread());

    }

}
// 实现线程第一种
class SecondThread extends Thread{
    @Override
    public void run() {
        System.out.println("这是第一种开启线程方法。。。");
    }
}
// 实现线程第二种
class ThirdThread implements Callable{

    public Integer call() throws Exception {
        System.out.println("这是第二种开启线程方法。。。");
        return 100;
    }

}
// 实现线程第三种
class TestThread implements Runnable {
        // 线程方法
    public void run() {
//        for (int i = 0; i < 10; i++) {
            System.out.println("__________________________________________");
            System.out.println( "进入线程第三种方法,开始执行。。。当前线程:"+Thread.currentThread().getName());
            System.out.println("__________________________________________");
//        }

    }
}

java线程之生产者与消费者问题

package com.bj.thread;


/**
 * @FileName: TestThread
 * @Remark:
 * @Author
 * @Date 2022-03-14
 * @Version 1.0.0
 */
class TestMain {
    public static void main(String[] args) {
         Tv tv=new Tv();
         new Player(tv).start();
         new Watcher(tv).start();
    }

}

// 生产者-->演员
class Player extends Thread {
    Tv tv;
    public Player(Tv tv){
        this.tv=tv;
    }

    @Override
    public void run() {
        for (int i = 0; i < 20; i++) {
            if(i % 2==0){
                // 表演节目
                this.tv.play("古惑仔在播放中。。。");
            }else {
                this.tv.play("广告时间:抖音,记录美好生活");
            }
        }
    }
}

// 消费者-->观众
class Watcher extends Thread {
  Tv tv;
  public Watcher(Tv tv){
      this.tv=tv;
  }
    @Override
    public void run() {
        for (int i = 0; i < 20; i++) {
            // 看节目
            this.tv.watch();
        }
    }
}

// 产品-->节目
class Tv {
    // 古惑仔电影
    String chinaGoodVoice;
    // 标志位
    boolean flag = true;

    //表演的方法
    public synchronized void play(String voice) {
        // 如果flag为flase,演员处于等待阶段
        if (!flag) {
            try {
                this.wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        // 表演
        System.out.println("演员表演了节目:" + voice);
        this.notifyAll();// 通知观众唤醒
        // 更新表演
        this.chinaGoodVoice = voice;
        // 万能表达式
        this.flag = !flag;
    }

    public synchronized void watch() {
        // 如果没有表演的话,那么就处于等待阶段
        if (flag) {
            try {
                this.wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        // 观看
        System.out.println("观众观看了节目:" + chinaGoodVoice);
        // 观看完节目之后通知演员表演节目
        this.notifyAll();
        // 清除标志位,此时flag又变为true
        this.flag = !flag;

    }
}

输出结果:

演员表演了节目:古惑仔在播放中。。。
观众观看了节目:古惑仔在播放中。。。
演员表演了节目:广告时间:抖音,记录美好生活
观众观看了节目:广告时间:抖音,记录美好生活
演员表演了节目:古惑仔在播放中。。。
观众观看了节目:古惑仔在播放中。。。
演员表演了节目:广告时间:抖音,记录美好生活
观众观看了节目:广告时间:抖音,记录美好生活
演员表演了节目:古惑仔在播放中。。。
观众观看了节目:古惑仔在播放中。。。
演员表演了节目:广告时间:抖音,记录美好生活
观众观看了节目:广告时间:抖音,记录美好生活
演员表演了节目:古惑仔在播放中。。。
观众观看了节目:古惑仔在播放中。。。
演员表演了节目:广告时间:抖音,记录美好生活
观众观看了节目:广告时间:抖音,记录美好生活
演员表演了节目:古惑仔在播放中。。。
观众观看了节目:古惑仔在播放中。。。
演员表演了节目:广告时间:抖音,记录美好生活
观众观看了节目:广告时间:抖音,记录美好生活
演员表演了节目:古惑仔在播放中。。。
观众观看了节目:古惑仔在播放中。。。
演员表演了节目:广告时间:抖音,记录美好生活
观众观看了节目:广告时间:抖音,记录美好生活
演员表演了节目:古惑仔在播放中。。。
观众观看了节目:古惑仔在播放中。。。
演员表演了节目:广告时间:抖音,记录美好生活
观众观看了节目:广告时间:抖音,记录美好生活
演员表演了节目:古惑仔在播放中。。。
观众观看了节目:古惑仔在播放中。。。
演员表演了节目:广告时间:抖音,记录美好生活
观众观看了节目:广告时间:抖音,记录美好生活
演员表演了节目:古惑仔在播放中。。。
观众观看了节目:古惑仔在播放中。。。
演员表演了节目:广告时间:抖音,记录美好生活
观众观看了节目:广告时间:抖音,记录美好生活
演员表演了节目:古惑仔在播放中。。。
观众观看了节目:古惑仔在播放中。。。
演员表演了节目:广告时间:抖音,记录美好生活
观众观看了节目:广告时间:抖音,记录美好生活

Process finished with exit code 0

管程法解决生产者与消费者问题

package com.bj.thread;

/**
 * @FileName: Threadrelation
 * @Remark: 管程法
  
 * @Date 2022-03-19
 * @Version 1.0.0
 */
public class Threadrelation {
    //计算机网络和操作系统
    // b站 : up主,湖科大教书匠 计算机网络微课堂
    // 操作系统:王道考研
    public static void main(String[] args) {
        SynContainer container = new SynContainer();
        new Product(container).start();
        new Consumer(container).start();
    }


}

// 生产者
class Product extends Thread {
    SynContainer container;

    Product(SynContainer container) {
        this.container = container;
    }

    @Override
    public void run() {
        // 假设生产20只鸡
        for (int i = 0; i < 20; i++) {
            container.push(new Chicken(i));
            System.out.println("生产了第" + i + "只鸡");
        }
    }
}

// 消费者
class Consumer extends Thread {
    SynContainer container;

    Consumer(SynContainer container) {
        this.container = container;
    }

    @Override
    public void run() {
        for (int i = 0; i < 20; i++) {
            Chicken chicken = container.pop();
            System.out.println("消费了第" + chicken.id + "只鸡");
        }
    }
}

// consumer
class Chicken {

    int id;

    Chicken(int id) {
        this.id = id;
    }

}


//缓冲区
class SynContainer {
    //    需要一个容器
    Chicken[] chickens = new Chicken[20];
    // 容器计数器
    int count = 0;

    //生产者嵌入产品
    public synchronized void push(Chicken chicken) {
        if (count == chickens.length) {
            // 通知消费
            try {
                this.wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        chickens[count] = chicken;
        count++;
        // 可以消费了
        this.notifyAll();
    }

    // 消费者方法
    public synchronized Chicken pop() {
        if (count == 0) {
            //等待生产者生成
            try {
                this.wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        count--;
        Chicken chicken = chickens[count];
        //吃完了 通知生产者生产
        this.notifyAll();
        return chicken;
    }

}



D:\GT\softInstalled\java8\bin\java.exe “-javaagent:D:\GT\softInstalled\intellijIdea\IntelliJ IDEA 2020.2.4\lib\idea_rt.jar=57908:D:\GT\softInstalled\intellijIdea\IntelliJ IDEA 2020.2.4\bin” -Dfile.encoding=UTF-8 -classpath D:\GT\softInstalled\java8\jre\lib\charsets.jar;D:\GT\softInstalled\java8\jre\lib\deploy.jar;D:\GT\softInstalled\java8\jre\lib\ext\access-bridge-64.jar;D:\GT\softInstalled\java8\jre\lib\ext\cldrdata.jar;D:\GT\softInstalled\java8\jre\lib\ext\dnsns.jar;D:\GT\softInstalled\java8\jre\lib\ext\jaccess.jar;D:\GT\softInstalled\java8\jre\lib\ext\jfxrt.jar;D:\GT\softInstalled\java8\jre\lib\ext\localedata.jar;D:\GT\softInstalled\java8\jre\lib\ext\nashorn.jar;D:\GT\softInstalled\java8\jre\lib\ext\sunec.jar;D:\GT\softInstalled\java8\jre\lib\ext\sunjce_provider.jar;D:\GT\softInstalled\java8\jre\lib\ext\sunmscapi.jar;D:\GT\softInstalled\java8\jre\lib\ext\sunpkcs11.jar;D:\GT\softInstalled\java8\jre\lib\ext\zipfs.jar;D:\GT\softInstalled\java8\jre\lib\javaws.jar;D:\GT\softInstalled\java8\jre\lib\jce.jar;D:\GT\softInstalled\java8\jre\lib\jfr.jar;D:\GT\softInstalled\java8\jre\lib\jfxswt.jar;D:\GT\softInstalled\java8\jre\lib\jsse.jar;D:\GT\softInstalled\java8\jre\lib\management-agent.jar;D:\GT\softInstalled\java8\jre\lib\plugin.jar;D:\GT\softInstalled\java8\jre\lib\resources.jar;D:\GT\softInstalled\java8\jre\lib\rt.jar;D:\GT\project\project_test\target\classes com.bj.thread.Threadrelation
生产了第0只鸡
生产了第1只鸡
生产了第2只鸡
生产了第3只鸡
生产了第4只鸡
生产了第5只鸡
生产了第6只鸡
生产了第7只鸡
生产了第8只鸡
生产了第9只鸡
生产了第10只鸡
生产了第11只鸡
生产了第12只鸡
生产了第13只鸡
生产了第14只鸡
生产了第15只鸡
生产了第16只鸡
消费了第14只鸡
生产了第17只鸡
消费了第17只鸡
生产了第18只鸡
消费了第18只鸡
消费了第19只鸡
消费了第16只鸡
生产了第19只鸡
消费了第15只鸡
消费了第13只鸡
消费了第12只鸡
消费了第11只鸡
消费了第10只鸡
消费了第9只鸡
消费了第8只鸡
消费了第7只鸡
消费了第6只鸡
消费了第5只鸡
消费了第4只鸡
消费了第3只鸡
消费了第2只鸡
消费了第1只鸡
消费了第0只鸡

Process finished with exit code 0

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值