0

メソッドを正確に呼び出す.interrupt()方法を教えてください。があるとき、いつ、どこでメソッドThread.sleep(1000)を呼び出すのですか? .interrupt()後ですか?やりたいことはThread.sleep(1000)途中でやめることです。

編集::

スレッドを途中で止めるのに苦労しています。これは私のコードの一部です。StoplightThreadクラスでは、最初の if ステートメントに問題があります。少なくとも 10 秒待ってから、ユーザーがボタンを押してライトを変更できるようにする必要があります。ボタンが押された場合、この場合は実行中のスレッドを停止する必要がありますThread.sleep(40000)。ボタンを押すとライトが変わりますが、糸は止まりません。まだ20秒残っているときにボタンを押すと、黄色のライトの10秒に20秒が追加され、30秒間黄色になります。

編集: ご不明な点がある場合は、stoplightCanvas.x == 3緑、stoplightCanvas.x == 2黄色、stoplightCanvas.x == 1赤です。

class StoplightCanvas extends Canvas implements ActionListener
{  

    public void actionPerformed(ActionEvent e)
    {
        if (e.getSource() == cross) {
            isPressed = true;
            if (x == 3 && canCross)
                x = 2;     
        }
        repaint();
    }

}


class StoplightThread extends Thread
{
    StoplightCanvas stoplightCanvas;

    StoplightThread(StoplightCanvas stoplightCanvas) {
        this.stoplightCanvas = stoplightCanvas;
    }

    public void run() 
    {
        if (stoplightCanvas.x == 3){
               Thread.sleep(10000);
               stoplightCanvas.canCross = true;
               Thread.sleep(40000);
               if(stoplightCanvas.isPressed)
                   StoplightThread.interrupt();
           } else if (stoplightCanvas.x == 2) {
               Thread.sleep(10000);    
           } else if (stoplightCanvas.x == 1) {
               Thread.sleep(60000);
           }
       } catch (InterruptedException e){}

           stoplightCanvas.toggleColor();
           stoplightCanvas.repaint();
        }           
    }
}
4

3 に答える 3

1

どうしても呼び出す場合interrupt()は、sleep() とは別のスレッドから呼び出します。

同じスレッドの途中で sleep() を中断したい場合は、次のようにします。

   Thread.sleep( 500 );
   ... 
   Thread.sleep( 500 );

そうは言っても、sleep() はコードのにおいがする可能性があります。

編集(OP編集後):

actionPerformed() メソッドの GUI スレッドから StoplightThread でinterrupt()を呼び出します。

于 2013-05-13T21:55:12.333 に答える
1

この例を試してください

public class Test1 {

    public static void main(String[] args) throws Exception {
        Thread t = new Thread() {
            public void run() {
                try {
                    Thread.sleep(2000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        };
        t.start();
        Thread.sleep(1000);
        t.interrupt();
    }
}

それは印刷します

java.lang.InterruptedException: sleep interrupted
    at java.lang.Thread.sleep(Native Method)
    at test.Test1$1.run(Test1.java:9)
于 2013-05-13T22:03:14.520 に答える
0

別のスレッドから呼び出すことができるように、割り込みたいスレッドへの参照が必要ですinterrupt()

于 2013-05-13T21:55:52.567 に答える