gpt4 book ai didi

java - Java中的runLater block 之间是否存在并发?

转载 作者:太空宇宙 更新时间:2023-11-04 13:47:37 25 4
gpt4 key购买 nike

我在一个单独的线程中的 Javafx GUI 应用程序中执行后台任务,该任务必须向用户提供有关此进程状态的一些提示,并时不时更新一些 GUI 元素。为了做到这一点,任务必须被组织在 runLater block 中。每个 runLater block 都会处理数组的一个元素,并增加作为全局变量的数组计数器。它似乎有效,但我的问题是是否保证这些 runLater block (在单个循环中一个接一个地启动)之间没有并发,或者是否有必要在访问数组时提供某种互斥机制(以互斥体或队列的形式)。

(用户通知发生在另一个线程中,但只有在工作线程被分成几个 runLater block 时才有效。)

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 应用程序线程上运行,并且不是并发的。任何时候调用 Platform.runLater 时,代码都会提交到队列,并在线程有合适的时间运行它时运行。

https://docs.oracle.com/javase/8/javafx/api/javafx/application/Platform.html#runLater-java.lang.Runnable-

关于java - Java中的runLater block 之间是否存在并发?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30674844/

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