abc三个线程循环打印1-75 这段代码有问题吗?

赵开元 发布于 2015/05/13 17:57
阅读 322
收藏 0

a 输出1-5,16-20

b输出6-10,21-25

c输出11-15,26-30

类似这种输出。


package test.test;


public class OneTwo {

    public static void main(String[] args) {

        Th1 t1 = new Th1();
        Th2 t2 = new Th2();
        Th3 t3 = new Th3();
        
        new Thread(t3,"C").start();
        new Thread(t2,"B").start();
        new Thread(t1,"A").start();
        

    }
}

class IInt {
    static Integer i = 1;
}

class Th1 implements Runnable {

    static boolean block = false;
    boolean needBlock = false;
    public void run() {
        // TODO Auto-generated method stub
        try {
            while (true) {
                synchronized (IInt.class) {
                    if (IInt.i <= 75) {
                        if ((((IInt.i - 1) / 5) % 3) == 0) {

                            block = false;
                            needBlock = false;
//                            synchronized (Th2.class) {
//                                if (!Th2.block) {
//                                    Th2.block = true;
//                                    Th2.class.wait();
//                                }
//                            }
//                            synchronized (Th3.class) {
//                                if (!Th3.block) {
//                                    Th3.block = true;
//                                    Th3.class.wait();
//                                }
//                            }

                            System.out.println(Thread.currentThread().getName()
                                    + " : " + IInt.i++);
                        } else {
//                            synchronized (Th2.class) {
//                                if (Th2.block && (((IInt.i - 1) / 5) % 3) == 1) {
//                                    Th2.block = false;
//                                    Th2.class.notifyAll();
//                                }
//                            }
                            
                            needBlock = true;
                            
                        }

                    } else
                        break;
                }
                synchronized (Th2.class) {
                    if (needBlock && Th2.block) {
                        Th2.block = false;
                        Th2.class.notify();
                    }
                }
                synchronized (this.getClass()) {
                    if (needBlock) {
                        block = true;
                        this.getClass().wait();
                    }
                }
            }
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

}

class Th2 implements Runnable {

    static boolean block = false;
    boolean needBlock = false;
    public void run() {
        // TODO Auto-generated method stub
        try {
            while (true) {
                synchronized (IInt.class) {
                    if (IInt.i <= 75) {
                        if ((((IInt.i - 1) / 5) % 3) == 1) {

                            block = false;
                            needBlock = false;
//                            synchronized (Th1.class) {
//                                if (!Th1.block) {
//                                    Th1.block = true;
//                                    Th1.class.wait();
//                                }
//                            }
//                            synchronized (Th3.class) {
//                                if (!Th3.block) {
//                                    Th3.block = true;
//                                    Th3.class.wait();
//                                }
//                            }
                            System.out.println(Thread.currentThread().getName()
                                    + " : " + IInt.i++);
                        } else {
//                            synchronized (Th3.class) {
//                                if (Th3.block && (((IInt.i - 1) / 5) % 3) == 2 ) {
//                                    Th3.block = false;
//                                    Th3.class.notifyAll();
//                                }
//                            }
                            needBlock = true;
                            
                        }
                    } else
                        break;
                }
            
                synchronized (Th3.class) {
                    if (needBlock && Th3.block) {
                        Th3.block = false;
                        Th3.class.notify();
                    }
                }
                synchronized (this.getClass()) {
                    if (needBlock) {
                        block = true;
                        this.getClass().wait();
                    }
                }
                
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}

class Th3 implements Runnable {

    static boolean block = false;

    boolean needBlock = false;
    public void run() {
        // TODO Auto-generated method stub
        try {
            while (true) {
                synchronized (IInt.class) {
                    if (IInt.i <= 75) {
                        if ((((IInt.i - 1) / 5) % 3) == 2) {

                            block = false;
                            needBlock = false;
//                            synchronized (Th2.class) {
//                                if (!Th2.block) {
//                                    Th2.block = true;
//                                    Th2.class.wait();
//                                }
//                            }
//                            synchronized (Th1.class) {
//                                if (!Th1.block) {
//                                    Th1.block = true;
//                                    Th1.class.wait();
//                                }
//                            }
                            System.out.println(Thread.currentThread().getName()
                                    + " : " + IInt.i++);
                        } else {
//                            synchronized (Th1.class) {
//                                if (Th1.block && (((IInt.i - 1) / 5) % 3) == 0) {
//                                    Th1.block = false;
//                                    Th1.class.notifyAll();
//                                }
//                            }
                            needBlock = true;
                            
                        
                        }
                    } else
                        break;
                }
                synchronized (Th1.class) {
                    if (needBlock && Th1.block) {
                        Th1.block = false;
                        Th1.class.notify();
                    }
                }
                synchronized (this.getClass()) {
                    if (needBlock) {
                        block = true;
                        this.getClass().wait();
                    }
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}
加载中
0
cnDavidChen
cnDavidChen
结果没错,好复杂……
0
simlegate
simlegate
没说功能,直接上代码,直接头晕。
0
吞鱼小王子
吞鱼小王子
这代码写的 头晕
0
bobdog1986
bobdog1986
您在问问题之前,能考虑下观众是否能看明白问题吗?
返回顶部
顶部