我在单独的线程中的Javafx GUI应用程序中执行后台任务,该任务必须不时更新一些GUI元素,向用户提供有关此进程状态的一些提示。为此,必须将任务组织在runLater块中。每个runLater块处理一个数组的元素,并增加作为全局变量的数组计数器。看来可行,但是我的问题是,是否可以保证这些runLater块之间(在一个循环中一个接一个地启动)没有并发性,还是在访问数组时有必要提供某种互斥机制? (以互斥或队列的形式)。
(用户通知发生在另一个线程中,但仅在将工作线程拆分为几个runLater块时才有效。)
public void do_deep()
{
do_deep_i=0;
String fen=b.report_fen();
for(int i=0;i<deep_legal_move_list_buffer_cnt;i++)
{
Platform.runLater(new Runnable()
{
public void run()
{
deep_san=deep_legal_move_list_buffer[do_deep_i++];
b.set_from_fen(fen);
b.make_san_move(deep_san, false);
//System.out.println("deep san "+deep_san+" fen "+b.report_fen());
b.go_infinite();
try
{
Thread.sleep(1000);
}
catch(InterruptedException ex)
{
}
b.stop_engine();
b.set_from_fen(fen);
//System.out.println("score "+b.score_numerical);
record_eval(fen,deep_san,-b.score_numerical);
}
});
try
{
Thread.sleep(1000);
}
catch(InterruptedException ex)
{
}
if(interrupt_deep)
{
break;
}
}
deep_going=false;
Platform.runLater(new Runnable()
{
public void run()
{
start_deep_modal.close();
}
});
}
最佳答案
我个人会为do_deep_i写一个getter / setter并使其同步。这样可以保证一次只能有一个线程可以修改该变量。
编辑:Platform.runLater在JavaFX Application线程上运行,并且不是并发的。每当调用Platform.runLater时,代码就会提交到队列中,并在线程有适当的时间运行它时运行。
https://docs.oracle.com/javase/8/javafx/api/javafx/application/Platform.html#runLater-java.lang.Runnable-