2016-12-04 5 views
0

У меня есть реализация потоков Java следующим образом:почему Java нить не таймаут

class MyThread extends Thread { 
    private static Integer counter = 1; 

    public MyThread(final String name) { 
     super(name + "_" + counter); 
     counter++; 
    } 

    @Override 
    public void run() { 
     try { 
      sleep(0,2); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 
     System.out.println(this.getName() + " true = " + true); 
    } 
} 

И основной класс следующим образом:

public class ThreadingTest { 

    public static void main(String[] args) { 
     MyThread thisThread = new MyThread("MyThread"); 
     thisThread.setDaemon(true); 
     thisThread.start(); 
     try { 
      Thread.sleep(0,1); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

Однако, даже если поток спит 2 наносекунд и вызывающий поток спадает только для 1 nano секунды, почему мой SOUT печатает заявление?

Принимая во внимание тот факт, что тайм-аут вызываемого потока больше, чем вызывающий поток, не должен ли он прерываться, прежде чем он сможет распечатать заявление?

+0

вы устанавливаете нить в качестве демона, потому что ваш поток будет в фоновом режиме вместо переднего плана. – Shriram

+2

@ Шрирам нет, это не какой комплектDaemon. Понятия переднего плана и фона даже не существуют. –

+1

Планировщик потоков может планировать потоки так, как он хочет. И одна наносекунда - очень и очень небольшое количество времени. Сделайте поток спящим несколько миллинов, и вы должны начать видеть то, что ожидаете. –

ответ

0

У вас не должно быть наносекундной точности с Thread.sleep(). Даже выполнение этих инструкций займет больше чем наносекунду. Попробуйте свой код с помощью miliseconds и посмотрите, работает ли он!

+1

«Просто подкорректируйте цифры до тех пор, пока они не начнут работать» - это ужасный, ужасный совет при нарезке. – Voo

+1

Нет, совет был посвящен Thread.sleep(), не имеющему наносекундного разрешения, что объясняет, почему код работает не так, как ожидалось. Если вы ставите миллисекунды или секунды, это будет служить доказательством концепции. Если вы основали логику приложения на этом, это, конечно, еще один вопрос (и ответ действительно нет) – Lucian

+0

Да, и моя жалоба заключается в том, что даже если сон был на второй секунде, этот код все равно не гарантированно будет работать. Вы говорите, что это сработает, если OP использует миллисекунды. Но если вы попробуете одну миллисекунду на разных ОС, конфигурациях оборудования и настройках программного обеспечения, вы увидите, что там очень много, где это неправильно. Попробуйте 15 мс, и вы уничтожаете неудачи, но я все еще могу легко создать систему, в которой код не будет работать. Единственный правильный ответ заключается в том, что код нарушен и его поведение неуказано – Voo

1

Темы, отмеченные как демон, будут уничтожены, когда все потоки не-демона будут завершены. Поэтому ваша нить просто убита. What is Daemon thread in Java?

+0

Это неверно. Нить Deamon будет работать как ниннальная нить (и будет defenitly не быть убита). Большая разница в том, что поток Deamon не препятствует выходу JVM. Он будет работать даже навсегда, если он застрял в цикле keep-alive, и вы не будете его убивать вручную. – n247s

+0

Итак, все сообщения в связанном вопросе и даже документ JDK ошибочны? – brummfondel

0

Метод Thread.sleep определяет только количество времени, в течение которого поток спит (как долго поток находится в состоянии TIMED_WAITING). По истечении этого времени поток удаляется из набора ожидающих потоков, но все еще должен ждать, чтобы получить процессорное время. И сколько времени потребуется, это очень недетерминированный параметр. Вы не должны полагаться на время, чтобы определить точную последовательность выполнения потоков.

+0

Не могли бы вы указать мне в правильном направлении, если мне нужно определить точную последовательность выполнения потоков. – dissatisfiedprogrammer

+0

Вы должны использовать механизмы синхронизации, созданные на языке Java, например: [Семафор] (https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/Semaphore.html) или [CountDownLatch ] (https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/CountDownLatch.html) очень полезны. Читайте об использовании ** synchronized ** clause. Это только начало. –

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