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

分析
其中一个线程负责打印数字,另一个线程负责打印字母,但有一个特点就是数字刚好是字母的2倍(字母26,数字52),数字一次打印2个,字母打印一个,并且字母打印线程一定是在数字打印线程之后才打印的。
如何控制字母打印线程一定是在数字打印线程之后,并且数字和字母还是交替出现的?
我们可以考虑用信号量来控制,假若说:当信号量为1的时候告诉打印数组线程执行,当数字是2的时候,让打印字母的线程执行,然后唤醒数字打印线程,又把数字改为1。

我们需要注意以下几点:

  1. 在每一次打印完之后要把flag的值改掉,并且唤醒下一个线程
  2. count什么时候++呢?在它打印完一个字母后这才算一个小流程完了,所以是在字母打印线程之后count++
  3. 还有就是在进行字母打印的时候,要对count-1,因为count的初值是1,再加’A’就是B了,所以要先对count-1,完了之后要把它强转成char
package www.java.test;

class Print{
    int flag = 1;
    int count = 1;
    public synchronized void printNum(){
        while(flag != 1){
            //此时应该打印字母,让打印数字线程等待
            try {
                wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        //打印数字
        System.out.print(2*count - 1);
        System.out.print(2*count);
        flag = 2;
        notify();
    }
    public synchronized void printChar(){
        while(flag != 2){
            //此时应该打印数字,字母打印线程等待
            try {
                wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        System.out.print((char)(count-1 + 'A'));
        //继续前行
        count++;
        flag = 1;
        notify();
    }
}
public class Test{
    public static void main(String[] args) {
        Print print = new Print();
        new Thread(()->{
            for(int i = 0; i < 26; i++){
                print.printNum();
            }
        }).start();
        new Thread(()->{
            for(int i = 0; i < 26; i++){
                print.printChar();
            }
        }).start();
    }
}

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/huaijiu123/article/details/86370451