java - 使用 Handler 在 EDT 和其他 Java 线程之间传递信息

标签 java multithreading swing handler

我有一个 GUI(在其 EDT 线程上)和另一个名为“Recorder”的线程,如果按下按钮,则由 GUI 的事件监听器创建:

if(actionEvent.getSource().equals(ui.record)) {
    if(recorderThread == null) {
        recorder = new Recorder();
        recorderThread = new Thread(recorder);
        recorderThread.start();
    }
}

在同一个事件监听器中,我还实现了一个 mouseListener。

public void mouseReleased(MouseEvent mEvent) {
    int x, y;

    x = mEvent.getXOnScreen();
    y = mEvent.getYOnScreen();
}

我想在单击鼠标时将这些 X 和 Y 变量传递给记录器线程中的记录器对象。我认为我可以使用 volatile 变量来解决解决方案,但我在某处读到处理程序可用于在两个线程之间传递信息或调用方法,并且有兴趣了解它。我发现this previous post面临着与我类似的问题。

然而,这篇文章的解决方案让我很困惑。我认为该人将线程对象传递到处理程序中,这样任何线程都可以调用该处理程序内的所有对象?例如:

handler(someObj);

然后在另一个线程中

handler.getSomeObj().methodInObj();

但我不完全确定处理程序是否是这样工作的。此外,他们似乎也在处理 Swing 的后台线程,而不是用户创建的单独线程(如果这是相同的概念,请提前道歉)。

最后,该解决方案似乎调用了 Java 库中内置的 Handler 类,而我想编写自己的处理程序类,以便我可以更好地学习线程如何通信(因为我是一个真正的 YouTube 教授新手程序员)。如果有人可以帮助我,我将不胜感激。提前致谢!

最佳答案

一方面区分线程的概念,另一方面区分类的概念(包括实例及其成员)。

线程可以通过多种方式进行通信(意味着在可以由其他线程写入或读取的位置读取或写入变量。在您的示例中,我会让您的 Recorder 类公开一个公共(public)方法 addCooperatives()。Recorder 有一个存储添加的坐标的私有(private)列表成员。真正的问题是对此列表的同步访问:您必须确保没有一个线程读取该列表,而另一个线程同时添加新记录。最简单的解决方案是有一个同步列表:

private List<Coordinates> myCoordinates = Collections.synchronizedList( new ArrayList<>());

public void addCoordinates( Coordinates coordinates)
{ 
    // this runs in the context of your GUI thread
    myCoordinates.add(coordinates);
    synchronized(this)
    {
        this.notify();    // wakes up the recorder thread
    }

}

public void run()
{
    // this runs in the context of the Recorder thread
    while ( true)
    {
        synchronized(this)
        {
            this.wait();   // waits until the 'this' is notified
        }

        for( Coordinates c : myCoordinates)
        {
            // do something
        }
    }
}

关于java - 使用 Handler 在 EDT 和其他 Java 线程之间传递信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45781155/

相关文章:

java - 从jar文件编译和运行时读取文件差异

java - 使用 PDF 表单作为 Java UI

java - 来自另一个线程的 Graphics.drawImage 不会在 Java Swing 中绘制任何内容

java - setSelectedIndex(-1) 不适用于 JComboBox

java - 传递到 Jersey + Jackson 时从实体中删除字段

java.lang.IllegalStateException : getAttributeNames: Session already invalidated

java - 了解此变量的范围和此线程的行为(编辑问题)

java - 在自定义 JPanel 中不调用 super.paintComponent 的影响

c++ - 这种无锁设计线程安全吗?

java - HashMap 值不更新