【发布时间】:2016-01-28 15:15:01
【问题描述】:
这里有两个类:
public class Cls implements Runnable, KeyListener
Thread t;
Object obj;
public Cls(Thing obj) {
this.obj = obj;
...
void keyPressed(KeyEvent e) {
...
}
void run() {
...
void start() {
if (t != null)
t = new Thread(this, "we");
t.start();
还有:
public class Main extends JPanel {
public static void main (String[] args)
{
Thing obj = new Thing(stuff);
Cls cl = new Cls(obj);
addKeyListener(cls);
...
}
(目前如何添加KeyListener 可能存在一些不准确之处,但我的意思是它被添加到Main 类中Cls 的实例中)
现在,如果出现KeyEvent,keyPressed 方法会在main() 的线程还是Cls' 中运行?询问是因为Cls 的线程的run() 方法将运行一个无限循环,因此它永远不会执行keyPressed如果它在Cls' 线程上运行。
另外,如您所见,Thinginstance,obj 在 Main 中实例化并按原样传递给 Cls' 构造函数。知道Cls 不断修改obj 并且Main 使用它(不以任何方式修改它),用sychronized 包装负责的代码块是否足以强制执行顺序访问?请随时提供您可能想要分享的任何见解。
【问题讨论】:
-
这听起来是个坏主意:
public class Cls implements Runnable, KeyListener一个设计良好的程序中的每个类、每个方法、每个线程都应该只做一个的事情。您的class Cls提供了按键处理程序和线程的主要方法。那将是 两 件事,除非你有另一种我还不明白的看待它的方式。 -
是的,这是我提出问题的一部分。我的意思是,我可能应该将
KeyListener实现移至Main类。我现在这样写的唯一原因是保持主类简短并专注于前端执行。
标签: java multithreading keylistener