【发布时间】:2016-09-16 03:35:48
【问题描述】:
-
当我启动 GUI 时,它会启动一个新线程。
final Server myServer = new Server(); final Thread t1 = new Thread(myServer, "T1"); t1.start(); -
GUI只有一个按钮,点击后会停止线程:
final JButton btnStartServer = new JButton("Stop server"); btnStartServer.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent arg0) { myServer.stop(); } }); -
线程将创建一个对象 TrackingServiceImpl,它是 Java RMI 服务器。线程本身看起来像这样:
class Server implements Runnable { private volatile boolean exit = false; public void run() { try { TrackingService server1 = new TrackingServiceImpl(); TrackingService serverInstance, stub = null; Registry registry = null; while (!exit) { serverInstance = ((TrackingServiceImpl) server1).getInstance(); stub = (TrackingService) UnicastRemoteObject.exportObject((TrackingService) serverInstance, 0); registry = LocateRegistry.createRegistry(4444); registry.bind("TrackingService", stub); System.out.println("Tracking service has started at port " + 4444); } System.out.println("Server is stopping...."); registry.unbind("TrackingService"); UnicastRemoteObject.unexportObject(registry, false); } catch (Exception e) { } } public void stop() { exit = true; } } 现在,如果我在将任何客户端连接到服务器之前单击该按钮,则代码可以正常工作。客户端将无法连接到服务器。但是,如果我让客户端连接到服务器,然后单击按钮,则客户端继续能够调用服务器上的方法,即使服务器应该已经停止(注册表已解除绑定并导出)。
提前致谢!
【问题讨论】:
-
“即使服务器应该已经停止(注册表解除绑定和导出)。”这是假设还是事实?
-
这不会阻止它吗? registry.unbind("TrackingService"); UnicastRemoteObject.unexportObject(registry, false);我的意思是,如果我在连接任何客户端之前停止服务器,它不会让客户端连接。但是,如果我在连接客户端后停止它,它似乎并没有停止,客户端仍然能够调用方法。
-
@Teddy 不,取消绑定并停止注册表。没有任何东西可以阻止远程对象。已经持有存根的客户端可以继续调用它。看我的回答。
标签: java multithreading rmi