紫牛部落 2015-10-13 02:43 采纳率: 0%
浏览 1398

求助,线程控制的问题

A线程取一批数据处理,然后将结果交给B,C,D三个线程继续处理,
等B、C、D三个线程处理完成后A才能取下一批数据,同样如果A没有取下一批数据,
B、C、D不能去执行。
如何用wait、notify、notifyAll合理控制,此处四个线程都是在循环执行

求指点,要怎么修改

 package test;

public class A extends Thread {

    public static Object my = null;
    public static Object my1 = null;
    public static Object my2 = null;
    public static Object my3 = null;

    @Override
    public void run() {
        while (true) {
            my = new Object();
            my1 = new Object();
            my2 = new Object();
            my3 = new Object();

            System.out.println("执行A");
            try {
                Thread.sleep(3000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            synchronized(A.my) {
                A.my.notifyAll();
            }
            synchronized(my1) {
                try {
                    A.my1.wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            synchronized(A.my2) {
                try {
                    A.my2.wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            synchronized(A.my3) {
                try {
                    A.my3.wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    public static void main(String[] args) {
        A a = new A();
        a.start();
        B1 b1 = new B1();
        b1.start();
        B2 b2 = new B2();
        b2.start();
        B3 b3 = new B3();
        b3.start();
    }
}

class B1 extends Thread {
    @Override
    public void run() {
        while (true) {
            try {
                synchronized(A.my) {
                    A.my.wait();
                }
            } catch (InterruptedException e1) {
                e1.printStackTrace();
            }
            System.out.println("执行B");
            try {
                Thread.sleep(3000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            synchronized(A.my1) {
                A.my1.notify();
            }
        }
    }
}

class B2 extends Thread {
    @Override
    public void run() {
        while (true) {
            try {
                synchronized(A.my) {
                    A.my.wait();
                }
            } catch (InterruptedException e1) {
                e1.printStackTrace();
            }
            System.out.println("执行C");
            try {
                Thread.sleep(3000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            synchronized(A.my2) {
                A.my2.notify();
            }
        }
    }
}

class B3 extends Thread {
    @Override
    public void run() {
        while (true) {
            try {
                synchronized(A.my) {
                    A.my.wait();
                }
            } catch (InterruptedException e1) {
                e1.printStackTrace();
            }
            System.out.println("执行D");
            try {
                Thread.sleep(3000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            synchronized(A.my3) {
                A.my3.notify();
            }
        }
    }
}

  • 写回答

3条回答 默认 最新

  • 毕小宝 博客专家认证 2015-10-13 02:49
    关注

    简单的生产者消费者模式的例子,可以参考:http://blog.csdn.net/wojiushiwo945you/article/details/42262149
    只要弄清楚这几个方法的用法,这个需求其实不难的。

    评论

报告相同问题?

悬赏问题

  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 对于相关问题的求解与代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 信号傅里叶变换在matlab上遇到的小问题请求帮助
  • ¥15 保护模式-系统加载-段寄存器
  • ¥15 电脑桌面设定一个区域禁止鼠标操作
  • ¥15 求NPF226060磁芯的详细资料