簡體   English   中英

從Java中的另一個線程訪問/共享對象

[英]accessing/sharing an object from another thread in Java

我有一個Java解決方案,其主線程運行JavaFX桌面應用程序。 另外,使用嵌入式Web服務器創建了另一個線程,該線程負責REST服務。 通過使用REST客戶端,我可以訪問REST服務,但是由於實際上我不在該線程中,所以無法訪問存在於主線程上下文中的對象。 請提供任何有關如何解決此問題的建議。

public class Main extends Application {

    public static MyBrowser myBrowser;

    @Override
    public void start(final Stage primaryStage) {

        myBrowser = new MyBrowser("http://localhost:8080/terminal");

        Scene scene1 = null;

        Screen s1 = null;       
        Rectangle2D screenBounds = Screen.getScreens().get(0).getVisualBounds();

        s1 = Screen.getScreens().get(0); // i replaced per 0
        scene1 = new Scene(myBrowser, screenBounds.getWidth(), screenBounds.getHeight());


        primaryStage.setTitle("Terminal 1");
        primaryStage.setFullScreen(true);
        primaryStage.setX(s1.getVisualBounds().getMinX());
        primaryStage.setY(s1.getVisualBounds().getMinY());
        primaryStage.setWidth(s1.getVisualBounds().getWidth());
        primaryStage.setHeight(s1.getVisualBounds().getHeight());
        primaryStage.setScene(scene1);
        log.info("before show() method...");
        primaryStage.show();

        // launch jetty web-server for REST services
        log.info("about to create a Thread object for running start() method...");

        MyThread jettyThread = new MyThread();
        jettyThread.setDaemon(true);
        jettyThread.start();

    }


    public static MyBrowser getMyBrowser() {
        return myBrowser;
    }

    public static void main(String[] args) {
        launch(args);
    }



        public class MyBrowser extends Region {

            HBox toolbar;
            public WebView webView = new WebView();
            WebEngine webEngine = webView.getEngine();
            ...                 
    }

    public class MyThread extends Thread {

        public void run() {

            try {

                EmbeddedWebServerController.start();

            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();

            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }

}

由於您已經有對對象的靜態引用,因此其他線程將能夠訪問該對象。 為了確保您看到正確的值,您必須使字段volatile

public volatile static MyBrowser myBrowser;

通常,除非線程是最終線程,否則在線程之間共享時必須將字段設置為可變字段。 另一種方式來做到這一點是將增加synchronized關鍵字的getter和setter myBrowser 使用synchronized還可以確保線程具有固有鎖定,以便您可以自動執行其他操作(例如,如果需要在分配字段新值之前做一些工作)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM