作为个人项目的一部分,我正在制作IRC bot。我的第一次尝试是让一个主类完成所有工作,但效率不高,所以我决定将IRC部分与机器人分开,制作一个非常简单的IRC客户端,连接到服务器,验证自己,加入通道和接收线。
然后我可以在IRC客户端接收它时处理每一行,或者将客户端放在一个线程中,它将这些行放入队列或映射中(取决于它是什么类型的行)。线程选项似乎更合适且具有挑战性。
由于机器人需要访问IRC客户端收到的行,我想把这些行放在机器人可以访问的公共静态队列中,但这让我想起C中的全局变量,我发现它很奇怪因为每个人都可以访问此字段。有没有办法可以让IRC客户端完成它的工作,机器人在没有公共静态字段的情况下达到峰值?
我想让IRC客户端使用同步方法传递线路,以便在线路可用时通知机器人。
答案 0 :(得分: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();
}
然后定义IRC
和Bot
类来实现Runnable
,并为它们提供以State
实例作为参数的构造函数。当然,共享状态的操作需要适当地同步。