2014-09-05 4 views
2

есть некоторая проблема в этом коде, его не получается. но когда я раскомментирую блок finally, его просто печатаю «полный» без печати «holas», любую идею?Неполное выполнение с присоединением

import java.util.ArrayList; 
import java.util.List; 


public class MyThread { 

    /** 
    * @param args 
    */ 
    public static boolean interruptTask=false; 

    public static class D extends Thread{ 
     public void run(){ 
      while(!interruptTask){ 
       System.out.print("Hello"); 
      } 
     } 
    } 


    public static void main(String[] args) { 
     // TODO Auto-generated method stub 
    Thread task = new D(); 
    task.start(); 
    try { 
     Thread.sleep(5000); 
    } catch (InterruptedException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
    interruptTask=true; 
    try { 
     task.join(); 
    } catch (InterruptedException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    }/*finally{ 
     System.out.println("holas"); 
    }*/ 
    System.out.println("complete"); 
    } 

} 
+0

Это было преждевременным меня, поэтому я вновь открыт. –

+0

Вы уверены, что не просто ожидаете 5 секунд? –

+0

Да, вы также можете попробовать затмение, надеюсь, вы получите тот же результат – user3363969

ответ

3

В коде нет ничего плохого, это ошибка в Eclipse.

Когда я запускаю код в Eclipse, я получаю поведение, описанное OP. Когда я запускаю сгенерированный файл класса из командной строки, он работает так, как ожидалось. Я подозреваю, что Eclipse выполняет буферизацию вывода и «забывает» записать его в окно консоли. Тот факт, что println() работает во время печати(), не поддерживает этого, но тогда я ожидал, что окончательный println() заставит Eclipse увидеть буфер.

Я также проверил тест, в котором я уменьшил тайм-аут с 5000 до 10 (миллисекунды), и в этом случае выход правильный в Eclipse.

Я подозреваю, что внутренний буфер в Eclipse, где он хранит консольный вывод, заполняется. Я предполагаю, что Eclipse ищет \n, чтобы скрыться в окне консоли. Он никогда не видит этого с исходным кодом OP, и когда буфер заполняется, Eclipse просто отбрасывает дополнительный вывод. Поскольку \n никогда не записывается в буфер консоли, он никогда не отображается.

Я отправлю ошибку в Eclipse Bugzilla. Это очень хороший тест.

EDIT: Вот еще лучше TestCase:

public class EclipseBug 
{ 
    private static int count = 781; 
    public static void main(String[] args) 
    { 
     for (int i=0; i<count; i++) 
      System.out.print("hello "); 
     System.out.println(); 
    } 
} 

С count = 780 это работает. С count = 781 не производится выход.

Затмение Bug Поданный: https://bugs.eclipse.org/bugs/show_bug.cgi?id=443433

Смежные вопросы