我有一个连接到服务器的类,如下所示。
@Override
public void run() {
while (running) {
try {
msgHandler.log("Connecting to " + host + ":" + port);
Socket s = new Socket(host, port);
if (s.isConnected() && !s.isClosed()) {
msgHandler.connectionInit(s);
}
BufferedInputStream input = new BufferedInputStream(s.getInputStream());
}
}作为msgHandler的消费者,如果连接出现故障,它会频繁地轮询套接字,如下所示。
@Override
public void connectionInit(Socket s) throws IOException {
logger.info("Connected to AWW Service on " + configuration.getAwwHost() + ":" + configuration.getAwwPort());
output = new BufferedOutputStream(s.getOutputStream());
connector.componentReady();
Timer t = new Timer();
t.schedule(new TimerTask() {
@Override
public void run() {
try {
pollServer();
} catch (IOException e) {
// SOCKET GETS BROKEN HERE
}
}
}, 0, 25000);
}问题是,当套接字连接断开时,我如何从异常中与run()线程通信,以便它可以尝试重新初始化套接字和输入流?
我不认为通知()或等待()机制在这里是合适的,因为wait()只会让run()线程休眠。我在想,当连接中断时设置一个标志相当于什么,run()线程不断地检查标志,当它被设置为true时,它会重新初始化套接字。但我相信java会有一种更有效的多线程方法来实现这一点。
发布于 2016-07-21 05:06:19
我认为最简单的方法是使用两个线程都可以访问的AtomicBoolean变量-如果需要,可以在构造每个线程的run类时传入该变量。关于AtomicBoolean的好处是,它已经是线程安全的/同步的,并且是可变的,所以它可以通过引用传递和修改。
有关更多详细信息,请参阅此similar question。
https://stackoverflow.com/questions/38490497
复制相似问题