Thread--生产者消费者假死分析

1 package p_c_allWait;
2
3 public class ValueObject {
4
5     public static String value = "";
6
7 }
 1 package p_c_allWait;
 2
 3 public class P {
 4
 5     private String lock;
 6
 7     public P(String lock) {
 8         super();
 9         this.lock = lock;
10     }
11
12     public void setValue() {
13         try {
14             synchronized (lock) {
15                 while(!ValueObject.value.equals("")) {
16                     System.out.println("生产者 " + Thread.currentThread().getName() + " WAITING 了");
17                     lock.wait();
18                 }
19                 System.out.println("生产者 " + Thread.currentThread().getName() + " RUNNABLE 了");
20                 String value = System.currentTimeMillis() + "_" + System.nanoTime();
21                 ValueObject.value = value;
22                 lock.notify();
23             }
24         } catch (Exception e) {
25             // TODO: handle exception
26             e.printStackTrace();
27         }
28     }
29
30 }
 1 package p_c_allWait;
 2
 3 public class C {
 4
 5     private String lock;
 6
 7     public C(String lock) {
 8         super();
 9         this.lock = lock;
10     }
11
12     public void getValue() {
13         try {
14             synchronized (lock) {
15                 while(ValueObject.value.equals("")) {
16                     System.out.println("消费者 " + Thread.currentThread().getName() + " wating 了");
17                     lock.wait();
18                 }
19                 System.out.println("消费者 " + Thread.currentThread().getName() + " RUNNABLE 了");
20                 ValueObject.value = "";
21                 lock.notify();
22             }
23         } catch (Exception e) {
24             // TODO: handle exception
25             e.printStackTrace();
26         }
27     }
28
29 }
 1 package p_c_allWait;
 2
 3 public class ThreadP extends Thread {
 4
 5     private P p;
 6
 7     public ThreadP(P p) {
 8         super();
 9         this.p = p;
10     }
11
12     @Override
13     public void run() {
14         while(true) {
15             p.setValue();
16         }
17     }
18
19 }
 1 package p_c_allWait;
 2
 3 public class ThreadC extends Thread {
 4
 5     private C c;
 6
 7     public ThreadC(C c) {
 8         super();
 9         this.c = c;
10     }
11
12     @Override
13     public void run() {
14         while(true) {
15             c.getValue();
16         }
17     }
18
19
20
21 }
 1 package p_c_allWait;
 2
 3 public class Run {
 4
 5     public static void main(String[] args) {
 6         String lock = "";
 7         P p = new P(lock);
 8         C r = new C(lock);
 9         ThreadP[] pThread = new ThreadP[2];
10         ThreadC[] cThread = new ThreadC[2];
11         for(int i=0; i<2; i++) {
12             pThread[i] = new ThreadP(p);
13             pThread[i].setName("生产者 " + (i+1));
14             cThread[i] = new ThreadC(r);
15             cThread[i].setName("消费者 " + (i+1));
16             pThread[i].start();
17             cThread[i].start();
18         }
19     }
20
21 }

notify每次只唤醒一个线程。

而notify唤醒线程是随机的,并不能保证每次唤醒的是异类线程,即生产者唤醒的可能是另一个生产者的线程。

时间: 2024-08-07 23:36:28

Thread--生产者消费者假死分析的相关文章

基于Java 生产者消费者模式(详细分析)

本文目录:1.等待.唤醒机制的原理2.Lock和Condition3.单生产者单消费者模式4.使用Lock和Condition实现单生产单消费模式5.多生产多消费模式(单面包)6.多生产多消费模式 生产者消费者模式是多线程中最为常见的模式:生产者线程(一个或多个)生成面包放进篮子里(集合或数组),同时,消费者线程(一个或多个)从篮子里(集合或数组)取出面包消耗.虽然它们任务不同,但处理的资源是相同的,这体现的是一种线程间通信方式. 本文将先说明单生产者单消费者的情况,之后再说明多生产者多消费者模

linux 假死分析

所谓假死,就是能ping通,但是ssh不上去:任何其他操作也都没反应,包括上面部署的apache也打不开页面. 作为一个多任务操作系统,要把系统忙死,忙到ssh都连不上去,也不是那么容易的.尤其是现在还有fd保护.进程数保护.最大内存保护之类的机制.你可以fork很多进程,系统会变得很慢,但是ssh还是能连上去:你可以分配很多内存,但是内存多到一定程度oom killer就会把你的进程杀掉,于是ssh又能工作了. 有一个确定可以把系统搞成假死的办法是:主进程分配500MB内存,然后不停的fork

java基础知识回顾之java Thread类学习(八)--java多线程通信等待唤醒机制经典应用(生产者消费者)

 *java多线程--等待唤醒机制:经典的体现"生产者和消费者模型 *对于此模型,应该明确以下几点: *1.生产者仅仅在仓库未满的时候生产,仓库满了则停止生产. *2.消费者仅仅在有产品的时候才能消费,仓空则等待. *3.当消费者发现仓储没有产品可消费的时候,会唤醒等待生产者生产. *4.生产者在生产出可以消费的产品的时候,应该通知等待的消费者去消费. 下面先介绍个简单的生产者消费者例子:本例只适用于两个线程,一个线程生产,一个线程负责消费. 生产一个资源,就得消费一个资源. 代码如下: pub

分析java进程假死状况

摘自: http://www.myexception.cn/internet/2044496.html 分析java进程假死情况 1 引言 1.1 编写目的 为了方便大家以后发现进程假死的时候能够正常的分析并且第一时间保留现场快照. 1.2编写背景 最近服务器发现tomcat的应用会偶尔出现无法访问的情况.经过一段时间的观察最近又发现有台tomcat的应用出现了无法访问情况.简单描述下该台tomcat当时具体的表现:客户端请求没有响应,查看服务器端tomcat的进程是存活的,查看业务日志的时候发

生产者/消费者模型

http://www.cnblogs.com/xrq730/p/4855663.html 什么是生产者/消费者模型 一种重要的模型,基于等待/通知机制.生产者/消费者模型描述的是有一块缓冲区作为仓库,生产者可将产品放入仓库,消费者可以从仓库中取出产品,生产者/消费者模型关注的是以下几个点: 1.生产者生产的时候消费者不能消费 2.消费者消费的时候生产者不能生产 3.缓冲区空时消费者不能消费 4.缓冲区空时生产者不能生产 生产者/模型作为一种重要的模型,它的优点在于: 1.解耦.因为多了一个缓冲区

java 多线程 22 :生产者/消费者模式 进阶 利用await()/signal()实现

java多线程15 :wait()和notify() 的生产者/消费者模式 在这一章已经实现了  wait/notify 生产消费模型 利用await()/signal()实现生产者和消费者模型 一样,先定义一个缓冲区: public class ValueObject { public static String value = ""; } 换种写法,生产和消费方法放在一个类里面: public class ThreadDomain41 extends ReentrantLock {

Java多线程14:生产者/消费者模型

什么是生产者/消费者模型 一种重要的模型,基于等待/通知机制.生产者/消费者模型描述的是有一块缓冲区作为仓库,生产者可将产品放入仓库,消费者可以从仓库中取出产品,生产者/消费者模型关注的是以下几个点: 1.生产者生产的时候消费者不能消费 2.消费者消费的时候生产者不能生产 3.缓冲区空时消费者不能消费 4.缓冲区满时生产者不能生产 生产者/模型作为一种重要的模型,它的优点在于: 1.解耦.因为多了一个缓冲区,所以生产者和消费者并不直接相互调用,这一点很容易想到,这样生产者和消费者的代码发生变化,

Java多线程-生产者/消费者模式实现

单生产者与单消费者 示例: public class ProduceConsume { public static void main(String[] args) { String lock = new String(""); Produce produce = new Produce(lock); Consume consume = new Consume(lock); new Thread(() -> { while (true) { produce.setValue();

java生产者/消费者模式实现——一生产者一消费者(操作值)

胶多不粘话多不甜,直接上代码: 生产者类: /** * Created by 51304 on 2016/2/28. */ public class P { private String lock; public P(String lock){ this.lock = lock; } public void setValue(){ try{ synchronized (this.lock){ if(!ValueObject.value.equals("")){ lock.wait();