-1

抱歉,如果问题不清楚

我正在制作一个简单的多线程程序,它有一个链表来存储除主线程之外创建的所有线程。然后我想发送一些信号来终止主线程,但只有在所有其他线程都关闭时,我打算这样做,当线程关闭时,它将自己从链表中删除,然后主线程将检查该列表是否size == 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 时,main 将检查 threadList 是否为null. 问题是我不知道如何使线程从列表中删除。正如我所搜索的,对于普通对象,我可以创建这样的方法

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

但是,在线程的情况下,类实现Runnable所以this引用是对象而不是存储在列表中的线程

4

2 回答 2

2

我建议使用 aHashMap而不是 a List。键可以是线程名称(例如Thread.getName()),值可以是线程。

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

您还应该将此地图创建为同步地图(使用Collections.synchronizedMap(...)

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

现在,每当你构造一个 Thread 时,你将这个 HashMap 传递给它的构造函数,并且 Thread 可以持有对它的引用。因此,当 Thread 即将终止时,它可以HashMap通过使用自己的 Thread 名称作为要删除的键来将自己从线程中删除。

于 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. 如果线程数可能很大, AHashSet<Thread>会更有效。

于 2016-06-02T15:23:43.663 回答