我们有一个应用程序创建了许多属于其线程的套接字,如果这个应用程序以某种方式失败,所有线程都会停止,这是不需要的。因此,为了克服这个问题,每个线程必须与主应用程序分离,如果其中一个线程失败,其他线程应该运行。我们想到的一件事是将创建的套接字传递给另一个java进程,那么正确的方法是什么?
还欢迎另一种方法吗?
等待你的建议......
答案 0 :(得分:3)
<强>分岔:强>
据我所知,您无法使用普通API在Java进程之间传递套接字句柄。但是,它似乎可以在Windows using the Winsock 2 API上实现。在Posix上,你应该能够分叉一个子进程来访问父套接字,因为forked processes inherit the parent's sockets。
我认为,您可以实现一个新的SocketImpl类,它支持将套接字句柄移动到另一个进程,但是您需要编写一些JNI代码来执行此操作。
对我来说听起来很毛茸茸,我怀疑在Java中分配一个新进程是个好主意!
<强>监听器:强>
另一种方法可能是生成一个新的“监听器”进程,该进程本质上是一个新的预分叉工作程序。然后,每个工作人员可以轮流监听套接字以进行连接。 然后,工人需要与控制过程协调,该过程根据需要管理产生新过程。
我同意@Bozho,如果一个线程中的错误可以将它们全部关闭(我想它必须是杀死整个应用程序的JVM异常)你有一个更大的问题。如果可能的话,你应该考虑隔离线程。
答案 1 :(得分:2)
不是。 (套接字无法序列化。)
当一个线程失败时,应该捕获,记录它的异常,这不应该干扰其他线程。 所以设计要么完全停止,要么设计为而不是完全停止。
或者将有关套接字(地址/端口)的所有信息传递给另一个应用程序,该应用程序本身可以打开类似的套接字。
答案 2 :(得分:2)
看到类似的问题socket passing between processes 不幸的是,地址空间的障碍不能超过。
答案 3 :(得分:1)
我更赞同Bozho你需要重新设计你的应用程序/评论者线程,以便异常或错误确实会杀死你的整个虚拟机。
为了帮助您,我建议您查看:
此致
CERBER
http://java.sun.com/j2se/1.5.0/docs/api/java/lang/Thread.html#setUncaughtExceptionHandler(java.lang.Thread.UncaughtExceptionHandler) http://java.sun.com/j2se/1.5.0/docs/api/java/lang/Runtime.html#addShutdownHook(java.lang.Thread)
答案 4 :(得分:0)
使用线程之间共享的类来保存套接字。您可以使用HashMap标记每个套接字,以便其他线程可以引用它所需的那个。
答案 5 :(得分:0)
我想回应那些说'只是抓住异常并退出线程'的人。
你无法捕捉所有例外情况。以下导致java jvm退出: