想实现a,b,c,d四个线程并行运行,要求d线程依赖于abc三个线程,abc三个线程执行完才能执行d线程,b线程依赖于c线程,c线程执行完才能执行b线程,以下是我写的代码,a、c线程执行完毕后就挂起了,不知道问题在哪儿,求指教
[code="java"]
package test.com.cn;
public class ThreadTest{
public static void main(String[] args) {
Signal s = new Signal();
Runnable at = new MyThreadABC(s,"A");
Runnable bt = new MyThreadABC(s,"B");
Runnable ct = new MyThreadABC(s,"C");
Runnable dt = new MyThreadD(s,"D");
new Thread(at).start();
new Thread(bt).start();
new Thread(ct).start();
new Thread(dt).start();
}
}
class Signal{
// private boolean abcend;
private Boolean bend = false;
private Boolean cend = false;
private Boolean aend = false;
public boolean isAend() {
return aend;
}
public void setAend(boolean aend) {
this.aend = aend;
}
public boolean isBend() {
return bend;
}
public void setBend(boolean bend) {
this.bend = bend;
}
public synchronized boolean isCend() throws InterruptedException {
synchronized (cend) {
while(!cend)
{
wait();
}
}
notifyAll();
return cend;
}
public synchronized void setCend(Boolean cend) {
synchronized (cend) {
this.cend = cend;
}
}
// public boolean isDend() {
// return dend;
// }
// public void setDend(boolean dend) {
// this.dend = dend;
// }
//
public synchronized boolean isAbcEnd() throws InterruptedException
{
synchronized(this)
{while(!(aend&&bend&&cend))
{
wait();
}
}
notifyAll();
return Boolean.valueOf(aend&&bend&&cend);
}
}
class MyThreadABC implements Runnable{
private Signal signal;
private String tid;
public String getTid() {
return tid;
}
public void setTid(String tid) {
this.tid = tid;
}
public Signal getSignal() {
return signal;
}
public MyThreadABC(Signal signal,String tid) {
this.signal = signal;
this.tid = tid;
}
public void setSignal(Signal signal) {
this.signal = signal;
}
public void run() {
if(tid=="A")signal.setAend(true);
try {
if(tid=="B"&&signal.isCend())signal.setBend(true);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if(tid=="C"){
signal.setCend(true);
}
System.out.println("我是进程"+tid+",执行完毕");
}
}
class MyThreadD implements Runnable{
private Signal signal;
private String tid;
public String getTid() {
return tid;
}
public void setTid(String tid) {
this.tid = tid;
}
public Signal getSignal() {
return signal;
}
public MyThreadD(Signal signal,String tid) {
this.signal = signal;
this.tid = tid;
}
public void setSignal(Signal signal) {
this.signal = signal;
}
public void run() {
try {
if(signal.isAbcEnd())
{
System.out.println("我是进程"+tid+",执行完毕");
}
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
[/code]
执行结果:我是进程A,执行完毕
我是进程C,执行完毕