Java中的runLater块之间是否存在并发?

时间:2015-06-05 20:01:39

标签: java multithreading concurrency javafx

我在一个单独的线程中在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();
            }

        });

    }

1 个答案:

答案 0 :(得分:0)

我个人会为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-