2015-08-27 76 views
0

我有一个Java解决方案,其主线程运行JavaFX桌面应用程序。另外,还会创建另一个线程,通过使用嵌入式Web服务器来处理REST服务。通过使用REST客户端,我可以访问REST服务,但是我无法访问主线程上下文中存在的对象,因为我实际上并不在该线程中。请就如何解决这个问题提出任何建议。从Java中的另一个线程访问/共享对象

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(); 
      } 
     } 
    } 

} 
+0

请提供示例代码。此外,如果我正确理解你,_synchronized_关键字是要走的路 – user2358582

+0

嗨user2358582,在这里你会看到代码。请详细说明如何实现synchronized关键字。谢谢 – ekremer

+0

我不知道如果它的完美方式去,但改变方法Main.getMyBrowser到“公共静态同步MyBrowser getMyBrowser()”,并获取对象如:Main.getMyBrowser()在方法mythread.run – user2358582

回答

0

由于您已经有了对象的静态引用,所以其他线程将能够到达它。为了确保您能够看到正确的值,你必须让外地volatile

public volatile static MyBrowser myBrowser; 

一般来说,你必须设置字段线程之间共享时,除非他们最终挥发。另一种方法是将​​关键字添加到myBrowser的获取者和设置者。使用​​还可以确保线程具有内部锁定,以便您可以自动执行其他操作(例如,如果在为该字段分配新值之前需要做一些工作)。

+0

谢谢。我会尝试你的建议 – ekremer