gpt4 book ai didi

java - 输入监听器应该同步吗?

转载 作者:太空宇宙 更新时间:2023-11-04 07:48:21 24 4
gpt4 key购买 nike

下面发布的示例代码显示了两个类。一个实现 KeyListener,另一个实现 Runnable,并在每 20 毫秒 hibernate 一次的无限循环中运行。当按下某个键时,int 形式的 keyChar 用作索引,设置 boolean 数组的索引 true 或 false,表示该键被按下或未按下。同时,进程循环在键数组中搜索其真值或假值,并将真值设置为假,然后打印出字符。我的问题是我是否需要使用使用锁的同步来访问 charArray,因为它在两个线程中使用:进程线程和 key 监听器线程。

示例代码:

import java.awt.Component;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

public class Input implements KeyListener {

public boolean[] charArray;

public Input(Component component) {
charArray = new boolean[127];
component.addKeyListener(this);
}

@Override
public void keyPressed(KeyEvent e) {
(possible synchronization with a lock?)
int keyChar = e.getKeyChar();
if (keyChar == 27 || keyChar == 9 || keyChar == 10 || keyChar == 127) //useless keys like del, tab, esc, etc..
keyChar = 65535;
if (keyChar < 65535) //65535 represents no true char value
charArray[keyChar] = true;
}

@Override
public void keyReleased(KeyEvent e) {
}

@Override
public void keyTyped(KeyEvent e) {
}
}




import java.awt.Dimension;
import javax.swing.JFrame;

@SuppressWarnings("serial")
public class Process extends JFrame implements Runnable {

private boolean running;
private Input input;

public Process() {
running = false;
input = new Input(this);
setTitle("Keyboard Test");
setSize(new Dimension(200, 200));
toFront();
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
}

/**
* @param args
*/
public static void main(String[] args) {
new Process().startThread();
}

public synchronized void startThread() {
running = true;
new Thread(this).start();
}

@Override
public void run() {
while (running) {
(possible synchronization with a lock?)
for (int i = 0; i < input.charArray.length; i++) {
if (input.charArray[i] == true) {
input.charArray[i] = false;
System.out.println((char) i);
}
}
try {
Thread.sleep(20);
} catch (InterruptedException e) {
}
}
}
}

最佳答案

当涉及到 AWT 或 Swing 时,第一条规则是永远不要同步或以其他方式干扰调度线程。如果您对此不熟悉,请查看 Dispatch Thread Issues

在您的情况下,我会将非 GUI 线程功能完全分离到一个单独的类中 - 并在必要时使用 java.util.concurrent 中真正有用的类之一在两者之间进行通信。

如果您由于线程问题而获得锁定或延迟,并且您实际上处于调度线程中,则整个 GUI 将卡住

关于java - 输入监听器应该同步吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14924926/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com