gpt4 book ai didi

java - 使用 Java 线程获取和发送消息

转载 作者:行者123 更新时间:2023-11-29 07:18:29 26 4
gpt4 key购买 nike

我想创建一个线程,它运行,用我给它的数据计算一些东西,并返回一些值或一个对象。该线程是 Swing GUI 的一部分。

我的问题:如何创建一个在创建线程时运行并返回对象(或任何我希望它返回的对象)的方法?

我的代码:

private void nextTurn () {
// do something
if (turn == white) {
try {
Engine e = new Engine(); // Engine is implemented by runnable
e.start();
Move m = e.getBestMove (board);
// thread should work, next code should be excecuted immediately
}
catch (Exception e) {}
}

// end of Main class
}

这是我第一次使用 Threads,我知道你应该尽可能避免使用它们,但这次我的 GUI 需要它。Oracle 站点上有关 Threads 的信息对我没有帮助。我能够制作一个无限期运行的多线程程序,但我不能让它与函数一起工作。

最佳答案

因为这是一个 Swing GUI,考虑使用一个创建后台线程的 SwingWorker 对象(所有代码都在 doInBackground 方法中运行),然后可以返回最终结果和/或中期结果。有关如何使用它的信息在此处的教程中有详细记录:

Concurrency in Swing

SwingWorkers 支持属性更改,因此允许监听器通过 PropertyChangeListener 观察其状态(作为 SwingWorker.StateValue)。这是您的程序可以确定线程已完成其处理、获取返回结果并从那里开始的一种方式。

顺便说一句,这不在您的生产代码中,是吗?:

catch (Exception e) {}

如果是这样,您可能希望解决此问题,因为被忽略的异常可能会在很长一段时间内咬住您。

例如,

  if (turn == white) {
try {
final SwingWorker<Move, Void> mySwingWorker = new SwingWorker<Move, Void>() {
@Override
protected Move doInBackground() throws Exception {
Engine e = new Engine(); // Engine is implemented by runnable
e.start();
Move m = e.getBestMove(board);
return m;
}
};

mySwingWorker.addPropertyChangeListener(new PropertyChangeListener() {
public void propertyChange(PropertyChangeEvent evt) {
if (StateValue.DONE == mySwingWorker.getState()) {
try {
Move m = mySwingWorker.get();

// TODO: insert code to run on the EDT after move determined

} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
}
}
});
mySwingWorker.execute();

} catch (Exception e) {
e.printStackTrace();
}
}

关于java - 使用 Java 线程获取和发送消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7347896/

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