2

作为个人项目的一部分,我正在制作一个IRC 机器人。我的第一次尝试是让一个主类完成所有工作,但效率不高,所以我决定将 IRC 部分与机器人分开,制作一个非常简单的 IRC 客户端,它可以连接到服务器、验证自身、加入通道和接收线。

然后,我可以在 IRC 客户端接收到每一行时对其进行处理,或者将客户端放入一个线程中,它将这些行放入队列或映射中(取决于它是什么类型的行)。线程选项似乎更合适且更具挑战性。

由于机器人需要访问 IRC 客户端收到的行,我想将这些行放在机器人可以访问的公共静态队列中,但这让我想起了 C 中的一个全局变量,我觉得这很奇怪,因为每个人都可以访问此字段。有没有办法让 IRC 客户端完成它的工作,让机器人在没有公共静态字段的情况下达到峰值?

我想过让 IRC 客户端使用同步方法传递线路,以便在线路可用时通知机器人。

4

1 回答 1

3

您可以在两个(或更多)线程之间共享状态,而无需使用静态字段。例如:

    public class State {
        private final Queue queue = ...
        private final Object somethingElse =
        // getters and setters
    }

    public static void main(String[] args) {
        State state = ...
        new thread(new IRC(state)).start();
        new thread(new Bot(state)).start();
    }

然后定义IRCBot类来实现Runnable并为它们提供以State实例作为参数的构造函数。当然,对共享状态的操作需要适当地同步。

于 2012-06-16T13:36:41.620 回答