【问题标题】:In which thread is the keyPressed() method called?在哪个线程中调用了 keyPressed() 方法?
【发布时间】: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 的实例中)

现在,如果出现KeyEventkeyPressed 方法会在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


【解决方案1】:

AWT 事件监听器在事件调度线程中执行。

阅读Swing concurrency tutorial

【讨论】:

  • 这是否意味着答案是“都不是”?另外,我已经用另一个问题更新了这个问题,因此非常感谢您对此的看法。 (顺便说一句,我是学生)。
  • @WIlopu,是的,这意味着答案是“都不是”。一旦您的程序开始使用 AWT 或 Swing,它就会自动获得一个新线程。您的所有事件处理程序都将在该线程中调用,并且(这很重要!)您对更新 GUI 对象的所有调用都必须该线程进行。也就是说,一旦屏幕上有对象,您应该只从事件处理程序中调用 GUI 框架方法,或者使用invokeLater 调用。阅读 JB 链接的教程。
  • 感谢您的澄清!您介意您指的是哪种 GUI 对象吗?以及如何访问 EDT 线程?这是我第一次接触多线程,所以我的知识还很浅。
  • javax.swing 包中的所有 GUI 组件及其模型只能从 EDT 使用。除了创建 GUI 的 main 方法,并且必须使用本教程中解释的 SwingUtilities.invokeLater() 之外,您不必担心太多,因为您将编写的大部分修改 GUI 的代码是对 GUI 中发生的事件做出反应的代码,因此已经在 EDT 中运行。如果你明确地启动后台线程,你必须小心。
  • @WIlopu,您不会“访问”事件调度线程;它调用你的处理程序。例如,在您调用jpanel.addKeyListener(cls); 之后,它将开始为面板中的每个键盘事件调用cls.keyPressed(e)。除了为 GUI 事件注册处理程序外,您还可以使用javax.swing.Timer 为定时事件注册处理程序,并且您可以使用javax.swing.SwingUtilities.invokeLater(r) 要求 EDT 及时调用任意Runnable 对象。
猜你喜欢
  • 1970-01-01
  • 2023-03-29
  • 2021-08-12
  • 2014-06-17
  • 1970-01-01
  • 2018-10-05
  • 2011-07-19
  • 1970-01-01
相关资源
最近更新 更多