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

范例: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.生产者放了若干次的数据,消费者才开始取数据,或者是,消费者取完一个数据后,还没等到生产者放入新的数据,有重复取出已取过的数据。

原文地址:https://www.cnblogs.com/meiCode/p/4611303.html