[英]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.