控制台聊天模拟程序需用多线程分离输入与输出以避免阻塞假死,推荐输入线程用Scanner(System.in, "UTF-8")读取,输出线程用volatile标志位控制定时回复,并通过ConcurrentLinkedQueue传递消息,同时注意Windows下cmd编码需设为UTF-8。
控制台聊天模拟程序不需要网络通信,核心是多线程协调输入与输出,避免阻塞导致“卡死”
Scanner 读取用户输入时必须注意阻塞问题控制台输入本质是阻塞式操作,Scanner.nextLine() 会一直等回车。如果把它放在主线程里,而另一方(比如模拟的“对方”)也依赖主线程输出,就会互相等待、假死。
System.in 输入,另一个负责定时/事件驱动的输出(比如模拟对方回复)while + Scanner + 状态标记,但需明确约定输入格式(例如以 /quit 退出)Thread 模拟“对方回复”要避免忙等待直接写 while(true) { Thread.sleep(1000); System.out.println("B: ..."); } 看似简单,但容易和用户输入冲突

volatile boolean running = true),在用户输入 /quit 后设为 false 安全退出Thread.sleep() 代替空循环,减少 CPU 占用Queue,回复线程从中取值处理——注意加同步或用 ConcurrentLinkedQueue
在 IntelliJ 或 Eclipse 运行正常,但 cmd 中运行出现问号或方块,大概率是编码不匹配。
cmd 默认是 GBK,Scanner 会按平台默认编码读取new Scanner(System.in, "UTF-8")(前提是终端已用 chcp 65001 切换到 UTF-8)InputStreamReader + BufferedReader,并传入 StandardCharsets.UTF_8
真正难的不是写完能“一问一答”,而是让两个角色看起来在“同时”说话、不抢光标、不丢消息、能随时退出——这些细节全藏在线程协作和 I/O 缓冲控制里。