多线程交叉打印数字(1-52)和字母(A-Z)

问题描述:

  写两个线程,一个线程打印1~52,另一个线程打印A~Z,打印顺序是12A34B...5152Z;

问题解决方案:

  经典的消费者生产者问题。

代码(Java版):

public class Test {
    public static void main(String[] args) {
        Center center = new Center();
        T1 t1 = new T1(center);
        T2 t2 = new T2(center);
        new Thread(t1).start();
        new Thread(t2).start();
    }
}
class T1 implements Runnable {
    private Center center;
    T1(Center center) {
        this.center = center;
    }
    @Override
    public void run() {
        for (int i = 1; i <= 50; i++) {
            center.shuzi();
        }
    }
}
class T2 implements Runnable {
    private Center center;
    T2(Center center) {
        this.center = center;
    }
    @Override
    public void run() {
        for(int i = 1; i <= 26; i++){
            center.zimu();
        }
    }
}

class Center {
    private int flag = 0;
    private int index = 1;
    public synchronized void shuzi() {
        while (flag < 2) {
            if(index > 52){
                System.exit(0);
            }
            System.out.print(index);
            index++;
            flag++;
        }
        if (flag == 2) {
            try {
                wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        notifyAll();
    }
    public synchronized void zimu() {
        while (flag >= 2) {
                System.out.print((char) ('A' + (index / 2 - 1)));
            flag -= 2;
            notifyAll();
        }
        if(flag == 0){
            try {
                wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

 

 

 

posted @ 2019-10-26 16:19  小留情  阅读(452)  评论(0)    收藏  举报