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

发布于 2022-09-12 01:25:43 字数 1583 浏览 16 评论 0

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();
        }

    }

}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

月隐月明月朦胧 2022-09-19 01:25:43
 char nextFlag = (char)('A' + (flag + 1) % 26); 
                               ^^^^

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

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

应该是

 char nextFlag = (char)('A' + (flag - 'A' + 1) % 26); 
                               ^^^^
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文