我正在尝试编写一个具有多个线程的Java程序。我有两个在启动时创建的变量。一个是AtomicBoolean,它告诉整个程序何时关闭(即关闭客户端)。另一个变量是一个ConcurrentHashMap,它包含一组在启动时加载的命令。有一些线程包含客户端可运行的客户端已被接受(每个客户端一个线程)运行。还有一个线程通过监听外部变化更新命令到HashMap中(从目录的新命令等)与并发共享变量
这里是代码:
class Program {
/* ... other vars like ServerSocket, etc. */
private final ConcurrentHashMap<String, String> mCommands;
private final AtomicBoolean mIsListening;
public static void main(String[] args) {
Program prog = new Program();
prog.loadCommands();
prog.listen();
}
public Program() {
mCommands = new ConcurrentHashMap<>();
mIsListening = new AtomicBoolean(true);
/* other initializations */
}
public void loadCommands() {
/* Loads commands generated from a directory; updates mCommands, then... */
new Thread(new CommandListenerRunnable(mCommands)).start();
}
public void listen() {
/* accepting a new client from server socket */
while (mIsListening.get()) {
Socket client = ss.accept();
new Thread(new ClientRunnable(client, mCommands, mIsListening)).start();
}
}
}
正如你所看到的,每我正在创建的孩子,我将这些变量作为参数传递。总而言之,这是分配这些变量的正确方法吗?任何想法将不胜感激。提前致谢!
保持对字段的控制并仅传递对this的引用可能更安全。 – shmosel
@shmosel谨慎地在答案中详细说明,如果它足够,我会将其标记为正确的?尝试了解如何在Runnables的上下文中使用对此的引用。 – Zack