我正在嘗試編寫一個具有多個線程的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