-1

質問がわかりにくかったらすいません

メインスレッドを除いて作成されたすべてのスレッドを格納するためのリンクリストを持つ単純なマルチスレッドプログラムを作成しています。次に、メインスレッドを終了するための信号を送信したいのですが、他のすべてのスレッドが閉じたときにのみ、スレッドが閉じたときにリンクリストから削除され、メインスレッドがそのリストかどうかを確認しますサイズ == null またはそうでない

ここに私のコードがあります

public class MainProgram {
    //some global static variable
    static List<Thread> threadList = new LinkedList<Thread>();
    public void main() throws IOException {
        ServerSocket serverSocket;
        serverSocket = new ServerSocket(1234);
        while(true){
            if(Shutdown_Handler.shutdown==true){
                //wait for all other thread close/terminate
                return
            }
            Socket s = serverSocket.accept();
            ClientThread x = new ClientThread(s);
            Thread y = new Thread(x);
            threadList.add(y);
            y.start();

        }
    }
}

Shutdown_Handler.shutdown==true の場合、メインは threadList がチェックされますnull。問題は、スレッドをリストから削除する方法がわからないことです。私が検索したものとして、通常のオブジェクトの場合、このようなメソッドを作成できます

public class someObject {
    public static void delete(){
        if(list.size = null) return;
        list.remove(this);
    }
}

ただし、スレッドの場合、クラスが実装するRunnableため、this参照はオブジェクトであり、リストに格納されているスレッドではありません

4

2 に答える 2

2

HashMapの代わりに を使用することをお勧めしListます。キーはスレッド名 (例: Thread.getName()) で、値はスレッドになります。

Map<String, Thread> threadMap = new HashMap<String, Thread>();

また、このマップを synchronizedMap として作成する必要があります ( を使用Collections.synchronizedMap(...))

Map<String, Thread> synchronizedMap = Collections.synchronizedMap(threadMap);

これで、Thread を作成するたびに、この HashMap をそのコンストラクターに渡すと、Thread はそれへの参照を保持できます。したがって、スレッドが終了しようとしているときに、HashMap削除するキーとして独自のスレッド名を使用して、スレッドから自分自身を削除できます。

于 2016-06-02T05:33:40.977 に答える
1

ClientThread が Runnable であると仮定すると、基本的なコードは次のようになります。

public class ClientThread implements Runnable {
    public void run() {
        // do stuff
        MainProgram.threadList.remove(Thread.currentThread());
    }
}

ただし、これにはいくつかの問題があります。

  1. 適切な同期なしで、リストに対して操作を実行する複数のスレッドが存在します。これは正しくありません。これを行うと、断続的な障害が発生する可能性があります。

  2. run()ブロック内のリストからスレッドを削除しない限りfinally、異常終了したスレッドは削除されない可能性があります。

  3. グローバルな静的を使用するのは悪い設計です。そして、それを裸の(プライベートではない)変数として公開するという最悪の設計。

  4. スレッド数が多くなりがちな場合は、 A のHashSet<Thread>方が効率的です。

于 2016-06-02T15:23:43.663 に答える