0

因此,假设我在 for 循环中创建并启动了一堆线程,这些线程正在启​​动器线程的 run 方法中执行。还假设我希望能够中断启动器线程和该线程创建的所有线程,我通过一个按钮来执行此操作。

所以像这样的东西 -

try{
            for(int i = 0; i < n;i++){

                Worker currThread = new Worker(someArgs);
                workerThreads.add(currThread);
                currThread.start();
            }
        } catch (InterruptedException e){
            e.printStackTrace();
        }

按钮-

public void actionPerformed(ActionEvent arg0) {

    List<Worker> threads = launchThread.getWorkerThreads();
        for(int i = 0; i < threads.size();i++){
            threads.get(i).interrupt();
        }
        launchThread.interrupt();

    }

现在,假设我想让中断不能与线程创建同时发生。我认为这样做的一种方法是构造一个虚拟对象并将两段代码都放在一个锁中

synchronized(dummyObject){
//thread creation or interruption code here (shown above) 
}

这种方式行得通吗?我问是因为我不确定如何测试它是否会。

4

2 回答 2

1

与创建线程分开启动线程。

for(int i = 0; i < n; i++) {
    Worker currThread = new Worker(someArgs);
    workerThreads.add(currThread);
}

// later
for (Worker w : workerThreads) {
    w.start();
}

如果这还不够,您的dummyObject同步应该可以正常工作。

// You probably need to make this a (private final) field
Object lock = new Object();

// later
synchronized (lock) {
    for(int i = 0; i < n; i++) {
        Worker currThread = new Worker(someArgs);
        workerThreads.add(currThread);
        w.start();
    }
}

// later still
public void actionPerformed(ActionEvent arg0) {
    synchronized (lock) {
        // interruption code here
    }
}
于 2012-10-31T01:57:54.267 回答
0

同步的概念保持不变,但要执行的底层操作很复杂。

正如您所指定的,有两种类型的互斥任务(线程创建和中断)。所以锁定几乎是这项工作的规范工具。

于 2012-10-31T02:06:23.613 回答