首页 java开发 多线程题

多线程题

[2018-10-20 11:14 类别:java开发 阅读(348) ]

题目:子线程循环10次,接着主线程循环100次,接着又回到子线程循环10次,接着再回到主线程100次,如此循环50次,请写出程序。

解题思路:子线程语主线程为互斥,可用SYNCHRONIZED。为了体现Java 的高类聚性,最好能将共同数据或共同方法归为同一类,即编写一个类来存放两个同步方法。要让他们交替进行,可用信号量控制,并用wait  ,notify 进行线程间通信。

public class TraditionalThreadSynchronized2 {
    public static void main(String[] args) throws Exception {
        Demo1 d1 = new Demo1();
        // 子线程
        new Thread(new Runnable() {
     
            @Override
            public void run() {
                for (int i = 1; i <= 50; i++) {
                    try {
                        d1.sub(i);
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }
            }
        }).start();

        // 主线程
        for (int i = 1; i <= 50; i++) {
            d1.main(i);
        }

    }
}

class Demo1 {
    public Boolean mainDoIt = false;标志主线程方法是否被调用
    // 子线程循环10次
    public synchronized void sub(int i) throws InterruptedException {
        while(mainDoIt) {
            this.wait();
        }
        for (int j = 1; j <= 10; j++) {
            System.out.println("sub" + j + "---SUB" + i);
        }
        mainDoIt=true; //子线程调用完毕
        this.notify();// 唤醒主线程
    }

    // 主线程循环100次
    public synchronized void main(int i) throws InterruptedException {
        while(!mainDoIt) {
            this.wait();
        }
        for (int j = 1; j <= 100; j++) {
            System.out.println("main" + j + "---MAIN" + i);
        }
        mainDoIt = false;//主线程调用完毕
        this.notify();// 唤醒子线程
        
    }
}


关于博主Jansens