• 线程操作之生产者及消费者


    范例:Info.java

     1 public class Info {
     2 
     3     private String name="王sir";
     4     private String Content="JAVA讲师";
     5     public String getName() {
     6         return name;
     7     }
     8     public void setName(String name) {
     9         this.name = name;
    10     }
    11     public String getContent() {
    12         return Content;
    13     }
    14     public void setContent(String content) {
    15         Content = content;
    16     }
    17     
    18 }

    范例:生产者

     1 public class Producer implements Runnable {
     2 
     3     private Info info = null;
     4 
     5     public Producer(Info info) {
     6         this.info = info;
     7     }
     8     @Override
     9     public void run() {
    10 
    11         boolean flag = false;
    12         for (int i = 0; i < 50; i++) {
    13             if (flag) {
    14                 this.info.setName("王sir");
    15                 try {
    16                     Thread.sleep(90);
    17                 } catch (InterruptedException e) {
    18                     e.printStackTrace();
    19                 }
    20                 this.info.setContent("JAVA講師");
    21                 flag = false;
    22             } else {
    23                 this.info.setName("張sir");
    24                 try {
    25                     Thread.sleep(90);
    26 
    27                 } catch (InterruptedException e) {
    28                     e.printStackTrace();
    29                 }
    30                 this.info.setContent("C#講師");
    31                 flag = true;
    32             }
    33         }
    34     }
    35 }

    范例:消费者

     1 public class Consumer implements Runnable {
     2 
     3     private Info info = null;
     4 
     5     public Consumer(Info info) {
     6         this.info = info;
     7     }
     8 
     9     @Override
    10     public void run() {
    11         for (int i = 0; i < 50; i++) {
    12             try {
    13                 Thread.sleep(100);
    14             } catch (InterruptedException e) {
    15                 e.printStackTrace();
    16             }
    17             System.out.println(this.info.getName() + "-->"
    18                     + this.info.getContent());
    19         }
    20     }
    21 
    22 }

    范例:主调方法

     1 public class ThreadCaseDemo {
     2     
     3     public static void main(String[] args) {
     4         Info i = new Info();
     5         Producer pro = new Producer(i);
     6         Consumer con = new Consumer(i);
     7         new Thread(pro).start();
     8         new Thread(con).start();
     9     }
    10 }

    范例:运行结果

    張sir-->JAVA講師
    王sir-->JAVA講師
    王sir-->C#講師
    張sir-->JAVA講師
    王sir-->C#講師
    張sir-->JAVA講師
    王sir-->C#講師
    張sir-->JAVA講師
    王sir-->C#講師
    張sir-->JAVA講師
    王sir-->JAVA講師
    王sir-->JAVA講師
    王sir-->JAVA講師
    王sir-->JAVA講師
    王sir-->JAVA講師
    王sir-->JAVA講師

    线程的运行是由CPU调度决定的,具有不容忽视的不确定性,所以在线程的使用中,存在2点问题:

    1.假设生产者线程刚向数据存储空间添加了信息的名称,还没有加入该信息的内容,程序就切换到了消费者线程,消费者线程将把信息的名称和上一个信息的内容联系到一起。(同步问题)

    2.生产者放了若干次的数据,消费者才开始取数据,或者是,消费者取完一个数据后,还没等到生产者放入新的数据,有重复取出已取过的数据。

  • 相关阅读:
    git 常用命令大全
    iOS UITextView placeHolder占位文字的N种方法实现方法
    ios自定义日期、时间、城市选择器
    zabbix-agent 自定义key
    linux过滤文本
    mysql修改默认存储目录
    git私库搭建
    vmdk,qcow2导入proxmox
    centos字符集问题
    ipset使用
  • 原文地址:https://www.cnblogs.com/meiCode/p/4611303.html
Copyright © 2020-2023  润新知