gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 17:55:00 26 4
gpt4 key购买 nike

我有一个 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/

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