0

好的,我在下面有以下代码

public static void StartDayProcessor(){
        new Thread(new Runnable() {
            public void run() {
                long lastSec = 0;
                while(DayProcessor.isDayProcessorActive){
                    long sec = System.currentTimeMillis() / 1000;
                    if (sec != lastSec) {
                        DayProcessor.secondsActive++;
                        DayProcessor.timeLeftInSecs = DayProcessor.day.getTimeLimitInSecs() - DayProcessor.secondsActive;
                        System.out.println("Seconds left for this day: " + DayProcessor.timeLeftInSecs);
                        if(DayProcessor.timeLeftInSecs == 0){
                            DayProcessor.isDayProcessorActive = false;
                            break;
                            //exit my own thread here!!
                        }
                    }
                }

            }
        });
    }

上面的代码在我更大的代码中,但我想知道的是如何通过在线程本身内部运行代码来停止线程运行。我怎样才能阻止它?

4

4 回答 4

1

停止线程的两种方法,一种您已经通过条件逻辑和break/使用的方法return

DayProcessor.isDayProcessorActive = false;
break;//return;

其他方法是使用interrupt

while(!Thread.currentThread.isInterrupted()) {
     ... logic
     if(condition) {
         Thread.interrupt();
     }
}
于 2013-07-04T05:59:17.797 回答
0
public static void StartDayProcessor(){
        new Thread(new Runnable() {
            public void run() {
                long lastSec = 0;
            LabeledLoop:
                while(DayProcessor.isDayProcessorActive){
                    long sec = System.currentTimeMillis() / 1000;
                    if (sec != lastSec) {
                        DayProcessor.secondsActive++;
                        DayProcessor.timeLeftInSecs = DayProcessor.day.getTimeLimitInSecs() - DayProcessor.secondsActive;
                        System.out.println("Seconds left for this day: " + DayProcessor.timeLeftInSecs);
                        if(DayProcessor.timeLeftInSecs == 0){
                            DayProcessor.isDayProcessorActive = false;
                            break LabeledLoop;
                            //exit my own thread here!!
                        }
                    }
                }

            }
        });
    }

通过打破循环,线程应该自行停止。

于 2013-07-04T08:48:06.573 回答
0

你可以使用 return 。

如果你想在特定条件下返回你的线程,你可以有一个全局变量并将它的值设置为 true,当你想返回你的线程并在你的线程中检查变量的值并调用 return。

它甚至可以从您可以将变量的值设置为 true 的主线程中帮助您控制线程。

于 2013-07-04T06:06:22.140 回答
0

停止线程的常用方法包括

  • 完成执行后让线程 run() 方法自动退出。
  • 检查可以从线程外部设置的状态变量。由于这是典型的 1 线程读取其他写入场景,因此应使用 volatile。

我不建议中断线程,因为这意味着线程没有正常终止,并且资源可能保持未清理状态。

于 2013-07-05T01:48:45.300 回答