/*
测试死锁和关键字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();
}
}
测试死锁和关键字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];
}
}
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();
}
}
}
}
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();
}
}
}
}
/*
=======================================
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
---------------------------------
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
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
=======================================
*/
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
=======================================
*/