refactor: 权限/AskUser回调改为虚拟线程执行,避免锁竞争

- handlePermissionInput 回调在虚拟线程中执行
- confirmAskUser 回调在虚拟线程中执行
- 移除 confirmAskUser 中多余的 synchronized 嵌套

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
pull/1/head
abel533 1 month ago
parent 7199b4f2dd
commit f28d2328ef
  1. 15
      src/main/java/com/claudecode/tui/ClaudeCodeComponent.java

@ -604,7 +604,9 @@ public class ClaudeCodeComponent extends Component<ClaudeCodeComponent.TuiState>
Consumer<String> cb = permissionCallback; Consumer<String> cb = permissionCallback;
permissionCallback = null; permissionCallback = null;
setState(new TuiState("", s.messages, 0, false, "")); setState(new TuiState("", s.messages, 0, false, ""));
if (cb != null) cb.accept(answer); if (cb != null) {
Thread.startVirtualThread(() -> cb.accept(answer));
}
} else if (key.backspace() && !s.inputText.isEmpty()) { } else if (key.backspace() && !s.inputText.isEmpty()) {
setState(new TuiState(s.inputText.substring(0, s.inputText.length() - 1), setState(new TuiState(s.inputText.substring(0, s.inputText.length() - 1),
s.messages, s.scrollOffset, false, "")); s.messages, s.scrollOffset, false, ""));
@ -669,7 +671,7 @@ public class ClaudeCodeComponent extends Component<ClaudeCodeComponent.TuiState>
} }
} }
/** 确认 AskUser 选择并回调 */ /** 确认 AskUser 选择并回调(调用方已持有 stateLock) */
private void confirmAskUser(String answer) { private void confirmAskUser(String answer) {
Consumer<String> cb = permissionCallback; Consumer<String> cb = permissionCallback;
permissionCallback = null; permissionCallback = null;
@ -677,11 +679,12 @@ public class ClaudeCodeComponent extends Component<ClaudeCodeComponent.TuiState>
askQuestion = null; askQuestion = null;
askInputMode = false; askInputMode = false;
askSelectedIndex = 0; askSelectedIndex = 0;
synchronized (stateLock) { TuiState s = getState();
TuiState s = getState(); setState(new TuiState("", s.messages, 0, false, ""));
setState(new TuiState("", s.messages, 0, false, "")); // 回调在锁外执行(cb.accept 可能阻塞或触发其他状态变更)
if (cb != null) {
Thread.startVirtualThread(() -> cb.accept(answer));
} }
if (cb != null) cb.accept(answer);
} }
/** 处理滚动输入 */ /** 处理滚动输入 */

Loading…
Cancel
Save