当另一个任务正在运行时禁止一个任务

时间:2012-10-31 01:53:58

标签: java multithreading

因此,假设我正在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) 
}

这种方式有用吗?我问,因为我不确定如何测试,看它是否会。

2 个答案:

答案 0 :(得分: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
    }
}

答案 1 :(得分:0)

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

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