2012-05-03 2 views
0

Я пытаюсь найти способ прервать поток, который в настоящее время цикличен бесконечно. С моим опытом я попытался создать второй поток, который прерывал бы первый, который бесконечно цикличен, но, конечно, из-за бесконечного цикла ... первый поток никогда не достигнет функции сна. Так что теперь я вернулся к этомуЗавершение одного потока (looping) с использованием другого потока

public class Pulse{ 

private static int z = 0; 

public static void main(String[] args) throws Exception { 
    try { 
     final long stop=System.currentTimeMillis()+5L; 
      //Creating the 2 threads 
     for (int i=0; i<2; i++) { 
      final String id=""+i+": "; 
      new Thread(new Runnable() { 
       public void run() { 
        System.err.println("Started thread "+id); 
        try{ 
         while (System.currentTimeMillis() < stop) { 
            //Purposely looping infinite 
          while(true){ 
           z++; 
           System.out.println(z); 
          } 
         } 
        } catch (Exception e) { 
         System.err.println(e); 
        } 
       } 
      }).start(); 
     } 
    } catch (Exception x) { 
     x.printStackTrace(); 
    } 
} 
} 
+0

Похоже, это может быть простофиля нескольких ... один пример того: http://stackoverflow.com/questions/4472611/java-kill- или-terminate-a-thread - часть 'using another thread' является коровой неявной. –

ответ

2

Есть volatile boolean поле, скажем running. Сделайте это true. Где у вас есть while (true), измените это на while (running) и while (System.currentTimeMillis() < stop) { на while (running && (System.currentTimeMillis() < stop)) { . Теперь измените running на false из какой-то другой темы. Это должно прекратить цикл довольно красиво.

1

Вы можете изменить

while(true){ 

в

while(!Thread.currentThread().isInterrupted()){ //or Thread.interrupted() 

Теперь, когда вы прервали нить должна правильно выйти из бесконечного цикла.

1

Вам нужно будет сделать вызов Thread.interrupted() внутри цикла, чтобы проверить, не было ли его прервано и соответствующим образом обработано. Или while (! Thread.interrupted()).

1

Вы должны сделать что-то вроде этого:

public class ThreadStopExample { 
    public static volatile boolean terminate = false; 

    public static void main(String[] args) { 
     new Thread(new Runnable() { 
      private int i; 

      public void run() { 
       while (!terminate) { 
        System.out.println(i++); 
       } 
       System.out.println("terminated"); 
      } 
     }).start(); 
     // spend some time in another thread 
     for (int i = 0; i < 10000; i++) { 
      System.out.println("\t" + i); 
     } 
     // then terminate the thread above 
     terminate = true; 
    } 
}