次のように、リンクされたリストにクライアント (アプレット) を追加および削除するシングルトン クラスがあります。
public class ClientManager {
//Collections.unmodifiableList
private static ClientManager instance = new ClientManager();
private static LinkedList<Bot> Clients = new LinkedList<>();
//private constructor here..
public static Bot add(final Bot bot) {
Clients.add(bot);
new Thread(new Runnable() {
@Override
public void run() {
while (bot.getApplet() == null) {
Utilities.sleep(10);
}
}
}).start();
return bot;
}
public static Bot remove(int hashCode) {
for (Iterator<Bot> it = Clients.iterator(); it.hasNext();) {
Bot bot = it.next();
if (bot.getCanvas().getClass().getClassLoader().hashCode() == hashCode) {
it.remove();
return bot;
}
}
return null;
}
public static Bot getBot(int hashCode) {
for (Bot bot : Clients) {
if (bot.getCanvas() != null && (bot.getCanvas().getClass().getClassLoader().hashCode() == hashCode)) {
return bot;
}
}
return null;
}
}
次に、actionListener を持つ各タブに終了ボタンがある JTabbedPane を持つ JFrame があります。
CloseButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
Frame.this.removeBot((Loader) component);
}
});
//Need to synchronize this function some how so that when I run it in a new Thread, they don't all access the LinkedList at the same time..
private void removeBot(final Loader loader) {
Frame.this.TabPanel.remove(loader); //Need to synchronize this or tabbedpane throws.. This call removes a tab..
List<Bot> Clients = ClientManager.getBots();
for (Iterator<Bot> it = Clients.iterator(); it.hasNext();) {
Bot bot = it.next();
if (bot != null && bot.getLoader() != null && bot.getLoader() == loader) {
it.remove();
loader.destruct(); //Destroy my applet. Calls applet.stop() and then applet.destroy()
}
}
System.gc();
}
質問:
複数のスレッドがタブを削除しようとしたときに TabbedPane がスローされないようにタブの削除を同期する方法と、複数のスレッドがエラーをスローするために同時に LinkedList から削除されないように削除機能を同期する方法上記のいずれかを新しいスレッドで実行すると..
チュートリアルを見てみましたが、関数の前に同期を入れましたが、それは役に立ちません。