2

件名のように、これらの同時スレッドを正しくシャットダウンしますか?

volatile フィールドを割り当て、while ループで繰り返しチェックします。

それを行う別の方法(同期または wait() メソッドを使用するなど) はありますか?教えてください。

編集コードを編集しました。スレッドが isAlive(); という別の方法で生きているかどうかを確認する方法はありますか? 多分:

boolean isAlive(){
    return running;
}

import javax.swing.JOptionPane;

public class Wat extends Thread {
    private char c;
    private int interv;
    private volatile boolean running = true;
    Object synchObj;

    public Wat(char c, int interv) {
        this.c = c;
        this.interv = interv;
        synchObj = new Object();
    }

    public void run() {
        while (running) {
            synchronized (synchObj) {
                try {
                    showChar(c);
                    synchObj.wait(interv * 100);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }

    }

    public synchronized static void showChar(char c) {
        System.out.println(c);
    }

    public void shutdown() {
        running = false;
        synchronized (synchObj) {
            synchObj.notify();
        }
    }

    public static void main(String[] args) throws InterruptedException {
        Wat w1 = new Wat('A', 3);
        Wat w2 = new Wat('B', 4);
        Wat w3 = new Wat('C', 5);
        w1.start();
        w2.start();
        w3.start();
        Object[] options = { "Shutdown A", "Shutdown B", "Shutdown C" };
        int option;
        while (w1.isAlive() || w2.isAlive() || w3.isAlive()) {
            option = JOptionPane.showOptionDialog(null,
                    "Which one would you like to shut?", "Threads",
                    JOptionPane.YES_NO_CANCEL_OPTION,
                    JOptionPane.QUESTION_MESSAGE, null, options, options[2]);
            switch (option) {
            case JOptionPane.YES_OPTION:
                w1.shutdown();
                break;
            case JOptionPane.NO_OPTION:
                w2.shutdown();
                break;
            case JOptionPane.CANCEL_OPTION:
                w3.shutdown();
                break;
            }
            Thread.sleep(1);
        }
    }
}
4

3 に答える 3

4

コードはおそらく問題なく動作しますが、Thread.sleep はあまり洗練されていません。これらの行に沿って何かを行い、shutdown() メソッドを呼び出してスレッドを終了します

 Object synchObj = new Object();

 public void run() {
    while (running) {
      synchronized (synchObj) {
         try {
            System.out.println(new Date());
            synchObj.wait(5000);
         } catch (InterruptedException e) {
             // error handling
         }
      }
    }
 }

 public void shutdown() {
    running = false;
    synchronized (synchObj) {
        synchObj.notify();
    }
 }


public static void main(String[] args) throws InterruptedException,
        IOException {
    ThreadTest test = new ThreadTest();
    test.start();
    BufferedReader tReader = new BufferedReader(new InputStreamReader(
            System.in));
    tReader.readLine();
    test.shutdown();
}

EDIT追加テストコード

于 2012-11-06T09:24:40.880 に答える
3

はい、スレッドを正しく閉じています。running唯一のコメントは、フラグに直接アクセスするため、ここでのカプセル化を破っているということです。shutdown()このフラグをに変更するメソッドを追加することをお勧めしますfalse

編集。

sleep()ループ内で呼び出していることに気づきました。ほとんどの場合、これは確かに悪い習慣です。おそらくを呼び出す必要がありますwait(timeout)。この場合、shutdown()メソッドはフラグをに変更してから、同じモニターでfalse呼び出します。notify()これにより、スレッドがすぐに終了します。

于 2012-11-06T09:19:11.143 に答える
0

プログラムは完璧で、揮発性ブール変数を使用してfalseにしているようです。

同期はマルチスレッドアクセスのみを必要とします。スリープの代わりに待機を使用できます。静的スリープではなくオブジェクトアクセスがあり、いつでも待機を中断できます。

于 2012-11-06T09:28:24.960 に答える