1

基本的に、私は無限に進むコンソールで実行されているJavaスレッドを持っています。ユーザーが「停止」と入力しない限り、プログラムはスレッドを停止してコンソールを停止する必要があります。

スレッドの種類のset_interval部分は次のようになります(ユーザーはスレッド間の間隔の長さを入力できます)。

public void set_interval(int mins, int secs) {
    time = (mins * 60000) + (1000 * secs);
    Timer timer = new Timer();
    timer.schedule(new TimerTask() {
        public void run() {
            try {
                count += counter;
                String name = getName();
                Date date = new Date();
                System.out.print("\n" + "Thread:" + name + " " + date + " - counter: " + count);
                Thread.sleep(time);
            } catch(InterruptedException e){
                System.out.print(e);
            }
    }, 0, time);    
}

メインは次のようになります。 }else if (checkLine.equals("halt")){ Thread test = new Thread("name"); test.interrupt(); break; }

私が見るところはどこでも割り込みを使うように言っていますが、この割り込みは機能していないようです。誰かアイデアがありますか?それとも私はいくつかの小さな詳細を見落としていますか?この問題を解決するには、ソケットを使用する必要がある可能性があります。

4

4 に答える 4

0

Thread.interruptすべてのスレッドで発行します。そして、これらのスレッドは割り込みをサポートする必要があります。基本的に、スレッドは次のことを行う必要があります。

  1. たとえば、次のように、時々中断フラグをテストしますThread.currentThread.isInterrupted()
  2. 受け取り終了InterruptedException
于 2012-10-19T08:28:30.367 に答える
0

中断は、中断したスレッドのみを中断します。コードでは、中断するスレッドを作成しますが、他のスレッドには影響しません。

割り込みをログに記録する以外はタイマーでスレッドを中断できますが、それが起こらなかったかのように続行します。つまり、スレッドは停止しません。

shutdownNow()スレッドプールを停止し、実行中のすべてのタスクを中断することをサポートしているため、これには ScheduleExecutorService を使用します。

于 2012-10-19T08:00:22.770 に答える
0

タスクの管理に使用できるScheduledExecutorServiceを見てください。エグゼキュータ サービスを使用すると、Java でのマルチスレッド ライブが容易になります :)

于 2012-10-19T08:02:16.890 に答える
0

タイマーを関数からクラススコープに移動してみませんか? そして、timer.purge()またはtimer.cancel()?- でもちょっと待って!非アクティブなタスクをすべて停止/キャンセルするだけです。現在実行中のタスクは決して停止されません。

現在実行中のタスクを停止しようとしています。簡単な方法はAtomicBoolean dontKeepRunning、タスクを終了する必要がある場合に true に設定する変数を用意することです。

このような:

private AtomicBoolean dontKeepRunning;
public YourTimerTask(){ dontKeepRunning = new AtomicBoolean();}
public void halt()
{
     dontKeepRunning.set(true);
}
public void set_interval(int mins, int secs) {
    time = (mins * 60000) + (1000 * secs);
    Timer timer = new Timer();
    timer.schedule(new TimerTask() {
        public void run() {
            try { 
                count += counter;
                String name = getName();
                Date date = new Date();
                System.out.print("\n" + "Thread:" + name + " " + date + " - counter: " + count);
                while(dontKeepRunning.get() == false){}
                return;
            } catch(InterruptedException e){
                System.out.print(e);
            }
    }, 0, time);    
}
于 2012-10-19T08:23:36.813 に答える