refactor: 权限/AskUser回调改为虚拟线程执行,避免锁竞争
- handlePermissionInput 回调在虚拟线程中执行 - confirmAskUser 回调在虚拟线程中执行 - 移除 confirmAskUser 中多余的 synchronized 嵌套 Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
This commit is contained in:
@@ -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);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/** 处理滚动输入 */
|
/** 处理滚动输入 */
|
||||||
|
|||||||
Reference in New Issue
Block a user