从Java中的另一个线程访问/共享对象

时间:2015-08-27 13:12:53

标签: java multithreading concurrency javafx

我有一个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();
            }
        }
    }

}

1 个答案:

答案 0 :(得分:0)

由于您已经拥有对象的静态引用,因此另一个线程将能够访问它。为确保您看到正确的值,您必须填写字段volatile

public volatile static MyBrowser myBrowser;

通常,在线程之间共享时必须将字段设置为易失性,除非它们是最终的。另一种方法是将synchronized关键字添加到myBrowser的getter和setter中。使用synchronized还可以确保线程具有内部锁定,以便您可以自动执行其他操作(例如,在为字段指定新值之前需要执行一些操作)。