0

では、ランチャー スレッドの run メソッドで実行される for ループで一連のスレッドを作成して開始するとします。また、ランチャー スレッドと、そのスレッドが作成したすべてのスレッドを中断できるようにしたいとしましょう。ボタンを使用してこれを行います。

だから、このようなもの -

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

同期の概念は変わりませんが、実行される基本的な操作は複雑です。

ご指摘のとおり、相互に排他的なタスクには 2 種類あります (スレッドの作成と中断)。そのため、ロックはこの仕事のほとんど標準的なツールです。

于 2012-10-31T02:06:23.613 に答える