java线程同步之再进一步

/*
 测试死锁和关键字synchronized
 wait方法的声明如下:
 public final void wait()
                throws InterruptedException
 在其他线程调用此对象的 notify() 方法或 notifyAll() 方法前,
 导致当前线程等待
 
 notify方法声明如下:
  public final void notify()
  
  唤醒在此对象监视器上等待的单个线程。如果所有线程都在此对象上等待,
  则会选择唤醒其中一个线程。选择是任意性的,并在对实现做出决定时发生。
  线程通过调用其中一个 wait 方法,在对象的监视器上等待。
  
  好累啊,腰好酸。一点都不想写这个线程的东西了。难受。
  
  三次运行的代码分别为
  前两次没有t3线程,但是data数组分别为6 3
  第三次加入了t3线程,同时data数组的容量为3
  对于程序的理解,现在不想写了。
  但是这里写几句,我们可以看到第三次运行的结果,发生了异常在Thread-0
  之后线程Thread-0就没有再运行
  
*/
public class PC {
 public static void main(String[] args) {
  SyncStack syn = new SyncStack();
  Runnable p = new Producer(syn);
  Runnable c = new Consumer(syn);
  
  Thread t1 = new Thread(p);
  Thread t2 = new Thread(c);
  Thread t3 = new Thread(p);//
 
  //t1.setPriority(Thread.NORM_PRIORITY + 3);
  t3.start();//
 
  t1.start();
  t2.start();
 }
}

class SyncStack {
 private int index = 0;
 private char[] data = new char[3];
 
 public synchronized void push(char ch) {
  if (index == data.length) {
   try {
    this.wait();
   } catch (InterruptedException e) {
    e.printStackTrace();
   }
   
  }
  this.notify();
  data[index] = ch;
  index ++;
 }
 
 public synchronized char pop() {
  if (index == 0) {
   try {
     this.wait();
    } catch (InterruptedException e) {
     e.printStackTrace();
    }
  }
  this.notify();
  
  index --;
  return data[index];
 }
}

class Producer implements Runnable {
 SyncStack synStack = null;
 
 public Producer(SyncStack syncStack) {
  this.synStack = syncStack;//在这里发生了空指针异常,因为少写成了synStack
 }
 public void run() {
  for (int i=0; i<20; i++) {
   char ch = (char)(Math.random() * 26 + 'A');
   System.out.println(Thread.currentThread().getName() + " Produce ----> " + ch);
   synStack.push(ch);
   try {
    Thread.sleep((int)(Math.random() * 1000));
   } catch (InterruptedException e) {
    e.printStackTrace();
  }
  
 }
 }
 
}

class Consumer implements Runnable {
 SyncStack synStack = null;
 
 public Consumer(SyncStack synStack) {
  this.synStack = synStack;
 }
 
 public void run() {
  for (int i=0; i<20; i++) {
   char ch = synStack.pop();
   
   System.out.println(Thread.currentThread().getName() + " 消费了 ----> " + ch);
   try {
    Thread.sleep((int)(Math.random() * 1000));
   } catch (InterruptedException e) {
    e.printStackTrace();
   }
   }
  
  
 }
 
 
}
/*
=======================================

D:\java\thread>javac PC.java

D:\java\thread>java PC
Thread-0 Produce ----> V
Thread-1 消费了 ----> V
Thread-0 Produce ----> G
Thread-1 消费了 ----> G
Thread-0 Produce ----> S
Thread-1 消费了 ----> S
Thread-0 Produce ----> A
Thread-1 消费了 ----> A
Thread-0 Produce ----> L
Thread-1 消费了 ----> L
Thread-0 Produce ----> K
Thread-0 Produce ----> J
Thread-1 消费了 ----> J
Thread-0 Produce ----> F
Thread-0 Produce ----> Z
Thread-1 消费了 ----> Z
Thread-1 消费了 ----> F
Thread-1 消费了 ----> K
Thread-0 Produce ----> Z
Thread-1 消费了 ----> Z
Thread-0 Produce ----> T
Thread-1 消费了 ----> T
Thread-0 Produce ----> A
Thread-1 消费了 ----> A
Thread-0 Produce ----> Y
Thread-0 Produce ----> R
Thread-0 Produce ----> U
Thread-0 Produce ----> F
Thread-1 消费了 ----> F
Thread-1 消费了 ----> U
Thread-0 Produce ----> R
Thread-1 消费了 ----> R
Thread-0 Produce ----> N
Thread-0 Produce ----> Z
Thread-0 Produce ----> D
Thread-1 消费了 ----> D
Thread-1 消费了 ----> Z
Thread-1 消费了 ----> N
Thread-1 消费了 ----> R
Thread-1 消费了 ----> Y
---------------------------------

D:\java\thread>javac PC.java

D:\java\thread>java PC
Thread-0 Produce ----> A
Thread-1 消费了 ----> A
Thread-0 Produce ----> I
Thread-1 消费了 ----> I
Thread-0 Produce ----> Z
Thread-1 消费了 ----> Z
Thread-0 Produce ----> C
Thread-1 消费了 ----> C
Thread-0 Produce ----> N
Thread-0 Produce ----> E
Thread-1 消费了 ----> E
Thread-0 Produce ----> L
Thread-0 Produce ----> S
Thread-1 消费了 ----> S
Thread-0 Produce ----> Q
Thread-1 消费了 ----> Q
Thread-0 Produce ----> P
Thread-1 消费了 ----> P
Thread-0 Produce ----> D
Thread-1 消费了 ----> D
Thread-0 Produce ----> Z
Thread-1 消费了 ----> Z
Thread-1 消费了 ----> L
Thread-1 消费了 ----> N
Thread-0 Produce ----> K
Thread-0 Produce ----> U
Thread-1 消费了 ----> U
Thread-1 消费了 ----> K
Thread-0 Produce ----> M
Thread-1 消费了 ----> M
Thread-0 Produce ----> X
Thread-0 Produce ----> U
Thread-1 消费了 ----> U
Thread-0 Produce ----> E
Thread-1 消费了 ----> E
Thread-1 消费了 ----> X
Thread-0 Produce ----> L
Thread-1 消费了 ----> L
Thread-0 Produce ----> P
Thread-1 消费了 ----> P

-----------------------------------

D:\java\thread>javac PC.java

D:\java\thread>java PC
Thread-0 Produce ----> L
Thread-2 Produce ----> S
Thread-1 消费了 ----> L
Thread-2 Produce ----> N
Thread-1 消费了 ----> N
Thread-2 Produce ----> L
Thread-0 Produce ----> J
Thread-1 消费了 ----> J
Thread-2 Produce ----> J
Thread-2 Produce ----> I
Thread-0 Produce ----> I
Thread-1 消费了 ----> J
Exception in thread "Thread-0" java.lang.ArrayIndexOutOfBoundsException: 3
        at SyncStack.push(PC.java:51)
        at Producer.run(PC.java:80)
        at java.lang.Thread.run(Thread.java:745)
Thread-1 消费了 ----> I
Thread-1 消费了 ----> L
Thread-2 Produce ----> Y
Thread-2 Produce ----> C
Thread-1 消费了 ----> C
Thread-1 消费了 ----> Y
Thread-1 消费了 ----> S
Thread-2 Produce ----> L
Thread-1 消费了 ----> L
Thread-2 Produce ----> V
Thread-1 消费了 ----> V
Thread-2 Produce ----> J
Thread-1 消费了 ----> J
Thread-2 Produce ----> M
Thread-1 消费了 ----> M
Thread-2 Produce ----> H
Thread-1 消费了 ----> H
Thread-2 Produce ----> Y
Thread-1 消费了 ----> Y
Thread-2 Produce ----> I
Thread-1 消费了 ----> I
Thread-2 Produce ----> O
Thread-1 消费了 ----> O
Thread-2 Produce ----> P
Thread-1 消费了 ----> P
Thread-2 Produce ----> W
Thread-1 消费了 ----> W
Thread-2 Produce ----> I
Thread-1 消费了 ----> I
Thread-2 Produce ----> X
Thread-2 Produce ----> T
=======================================
*/


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值