首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在Java中设置线程之间的“标志”

在Java中设置线程之间的“标志”
EN

Stack Overflow用户
提问于 2016-07-21 04:43:50
回答 2查看 1.2K关注 0票数 0

我有一个连接到服务器的类,如下所示。

代码语言:javascript
运行
复制
@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的消费者,如果连接出现故障,它会频繁地轮询套接字,如下所示。

代码语言:javascript
运行
复制
@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会有一种更有效的多线程方法来实现这一点。

EN

回答 2

Stack Overflow用户

发布于 2016-07-21 05:06:19

我认为最简单的方法是使用两个线程都可以访问的AtomicBoolean变量-如果需要,可以在构造每个线程的run类时传入该变量。关于AtomicBoolean的好处是,它已经是线程安全的/同步的,并且是可变的,所以它可以通过引用传递和修改。

有关更多详细信息,请参阅此similar question

票数 0
EN

Stack Overflow用户

发布于 2016-07-21 17:53:39

我认为在run()函数中,应该有如下代码。

代码语言:javascript
运行
复制
// ...
try
{
    // ...
    int read = input.read(...);
    // ...

}
catch (IOException e)
{
    // TODO: terminate the thread and restart a new connection
}

因此,如果在pollServer()调用过程中发生错误,我上面的代码也应该生成一个异常。

此外,当您调用Socket对象的close函数时,输入流和输出流将生成相对异常。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38490497

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档