这段循环按顺序打印 ABCD...的多线程程序的输出结果为什么不对?

1这段循环按顺序打印 ABCD...的多线程程序的输出结果为什么不对?
2我中文注释中的理解是否正确?

import java.util.HashMap;

public class Main{

    static char globalFlag = 'A';
    static HashMap<Character,Object> m = new HashMap<>();

    static class MyThread extends Thread{

        char flag;

        MyThread(char flag){
            this.flag = flag;
        }

        @Override
        public void run() {
            while (true){

                Object thisLock = m.get(flag);
                char nextFlag = (char)('A' + (flag + 1) % 26);
                Object nextObjectLock
                synchronized (thisLock){

                    if (flag != globalFlag){
                        try {
                            thisLock.wait(); // 线程会被阻塞住,直到其他线程执行对应Lock.notify();
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }

                    System.out.println(flag);

                    globalFlag = nextFlag;
                }



                // 唤醒下一个线程

                Object nextObjectLock = m.get(nextFlag);
                synchronized(nextObjectLock){
                    nextObjectLock.notify(); // 通知执行nextObjectLock.wait()的线程可以继续执行
                }
            }
        }
    }

    public static void main(String[] args) {
        for (int i = 0; i < 26; i++) {
            m.put((char)('A' + i),new Object());
        }
        for (int i = 0; i < 26; i++) {
            new MyThread((char)('A' + i)).start();
        }

    }

}

阅读 2.3k
1 个回答
 char nextFlag = (char)('A' + (flag + 1) % 26); 
                               ^^^^

这个 flag 是 'A' ,不是 0 啊 ...

'A' + ('A' + 1) %26 , 就变成多少了 ...

应该是

 char nextFlag = (char)('A' + (flag - 'A' + 1) % 26); 
                               ^^^^
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题