我下面发布的示例代码显示了两个类。一个实现KeyListener,另一个实现Runnable,并在每20 ms休眠的无限循环中运行。当按下键时,采用int形式的keyChar用作索引,设置布尔数组的索引true或false,表示是否按下了该键。同时,过程循环正在键数组中搜索其true或false值,并将true设置为false,然后打印出char。我的问题是我是否需要使用带锁的同步来访问charArray,因为它在两个线程中使用:进程线程和键侦听器线程。
样例代码:
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) { } } } }
您的charArray变量至少可以从两个线程(在Process中启动的一个线程和您的Input类中的EDT)访问,因此您需要同步这些访问以确保可见性(即,确保一个线程所做的更改在另一个线程中可见) )。
charArray
请注意,您的代码中还有其他一些问题,例如:
input = new Input(this)
component.addKeyListener(this)
JFrame
Process
running
run