我有一个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();
}
}
}
}
答案 0 :(得分:0)
由于您已经拥有对象的静态引用,因此另一个线程将能够访问它。为确保您看到正确的值,您必须填写字段volatile
:
public volatile static MyBrowser myBrowser;
通常,在线程之间共享时必须将字段设置为易失性,除非它们是最终的。另一种方法是将synchronized
关键字添加到myBrowser
的getter和setter中。使用synchronized
还可以确保线程具有内部锁定,以便您可以自动执行其他操作(例如,在为字段指定新值之前需要执行一些操作)。