wangweipeng87 2013-03-06 15:07
浏览 240
已采纳

关于多线程的问题

想实现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,执行完毕

  • 写回答

4条回答 默认 最新

  • yuyue007 2013-03-07 09:51
    关注

    [code="java"]
    package test.thread.concurrent;

    import java.util.Random;
    import java.util.concurrent.BrokenBarrierException;
    import java.util.concurrent.CyclicBarrier;
    import java.util.concurrent.TimeUnit;

    /**

    • @author yu
    • Created date: 2013-3-7

      */
      public class CyclicBarrierTest {

      Thread a = new Thread(new Runnable() {
      @Override
      public void run() {
      try {
      System.out.println("Thread A started...");
      TimeUnit.SECONDS.sleep(new Random().nextInt(5));
      System.out.println("Thread A starts waiting...");
      waitAbc.await(); // waiting
      } catch (InterruptedException e) {
      e.printStackTrace();
      } catch (BrokenBarrierException e) {
      e.printStackTrace();
      }
      }
      });

      Thread b = new Thread(new Runnable() {
      @Override
      public void run() {
      try {
      System.out.println("Thread B started...");
      TimeUnit.SECONDS.sleep(new Random().nextInt(5));
      System.out.println("Thread B is waiting...");
      waitAbc.await();
      } catch (InterruptedException e) {
      e.printStackTrace();
      } catch (BrokenBarrierException e) {
      e.printStackTrace();
      }
      }
      });

      Thread c = new Thread(new Runnable() {
      @Override
      public void run() {
      try {
      System.out.println("Thread C started...");
      TimeUnit.SECONDS.sleep(new Random().nextInt(5));
      System.out.println("Thread C starts waiting...");
      waitC.await();
      } catch (InterruptedException e) {
      e.printStackTrace();
      } catch (BrokenBarrierException e) {
      e.printStackTrace();
      }

      }
      

      });

      Thread d = new Thread(new Runnable() {
      @Override
      public void run() {
      try {
      System.out.println("Thread D started...");
      TimeUnit.SECONDS.sleep(new Random().nextInt(5));
      System.out.println("Thread D ends..");
      } catch (InterruptedException e) {
      e.printStackTrace();
      }
      }
      });

      // waiting c execute and execute b
      CyclicBarrier waitC = new CyclicBarrier(1, new Runnable() {
      @Override
      public void run() {
      System.out.println("Thread C ends, starting B...");
      b.start();
      }
      });

      // waiting a,b(,c) execute d
      CyclicBarrier waitAbc = new CyclicBarrier(2, new Runnable() {
      @Override
      public void run() {
      System.out.println("Thread A, B, C ends, starting D...");
      d.start();
      }
      });

      public static void main(String[] args) {
      CyclicBarrierTest test = new CyclicBarrierTest();
      test.a.start();
      test.c.start();
      }

    }

    [/code]

    某一次的运行结果
    [quote]
    Thread A started...
    Thread C started...
    Thread A starts waiting...
    Thread C starts waiting...
    Thread C ends, starting B...
    Thread B started...
    Thread B is waiting...
    Thread A, B, C ends, starting D...
    Thread D started...
    Thread D ends..

    [/quote]

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

悬赏问题

  • ¥15 目前主流的音乐软件,像网易云音乐,QQ音乐他们的前端和后台部分是用的什么技术实现的?求解!
  • ¥60 pb数据库修改与连接
  • ¥15 spss统计中二分类变量和有序变量的相关性分析可以用kendall相关分析吗?
  • ¥15 拟通过pc下指令到安卓系统,如果追求响应速度,尽可能无延迟,是不是用安卓模拟器会优于实体的安卓手机?如果是,可以快多少毫秒?
  • ¥20 神经网络Sequential name=sequential, built=False
  • ¥16 Qphython 用xlrd读取excel报错
  • ¥15 单片机学习顺序问题!!
  • ¥15 ikuai客户端多拨vpn,重启总是有个别重拨不上
  • ¥20 关于#anlogic#sdram#的问题,如何解决?(关键词-performance)
  • ¥15 相敏解调 matlab