2015-10-31 3 views
0

Для этого кода цифры печатаются от 1 до 10 для резьбы t1, а затем для резьбы t2.Почему я получаю разные выходные данные для приведенных ниже программ?

class Synchtest { 
    public static void main(String args[]) { 
     synchtest2 a = new synchtest2(); 
     Thread t1 = new Thread(a); 
     Thread t2 = new Thread(a); 
     t1.start(); 
     t2.start(); 
    } 
} 

class synchtest2 extends Thread { 

    public synchronized void run() { 
     for (int i = 0; i <= 10; i++) { 
      System.out.println(i); 
      try { 
       sleep(1000); 
      } catch (Exception e) { 
      } 
     } 
    } 
} 

, но для нижеследующего кода они напечатаны как 00 11 22 33 44 55 и так далее.

class Synchtest { 
    public static void main(String args[]) { 

     synchtest2 t = new synchtest2(); 
     synchtest2 t2 = new synchtest2(); 
     t.start(); 
     t2.start(); 
    } 
} 

class synchtest2 extends Thread { 

    public synchronized void run() { 
     for (int i = 0; i <= 10; i++) { 
      System.out.println(i); 
      try { 
       sleep(1000); 
      } catch (Exception e) { 

      } 

     } 
    } 
} 

ответ

1

В первом примере один экземпляр synchtest2 используется обоими потоками, так как их Runnable и его метод run() синхронизированы. Таким образом, первый поток, который запускается, получает монитор этого уникального экземпляра, печатает все числа, а затем выпускает монитор, позволяя запустить второй поток.

Во втором примере у вас есть два разных экземпляра, и каждый поток использует свой собственный экземпляр. Таким образом, они одновременно приобретают собственный монитор параллельно (поскольку каждый объект имеет свой собственный монитор) и с радостью печатают свои номера одновременно.

0

Поскольку они представляют собой два отдельных потока, они работают параллельно.

Это означает, что они в основном оба печатают каждый номер одновременно, что помещает их в одну строку, вместо того, чтобы вставлять разрыв строки между ними.

Если вы положили небольшую задержку между началом потоков, вы увидите, что они размещены на разных строках.

В первом примере, поскольку вы используете один и тот же класс для обоих потоков, он завершит его, прежде чем переходить на второй. Если вы хотите получить аналогичный результат, вам нужно будет дождаться завершения первого потока, прежде чем запускать второй поток.

0

В первом примере вы используете один и тот же экземпляр Thread дважды. Они не будут запускаться параллельно, потому что есть только один поток за раз, разрешенный для входа в процедуру экземпляра run().

Во второй раз, когда вы создаете два разных экземпляра synchtest, которые создают два разных потока, которые могут работать параллельно.

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