2015-07-10 5 views
1

У меня есть код-Как потоки выполняются в Java

public class ThreadOne 
{ 
    public static void main(String[] args) 
    { 
     Thread1 th=new Thread1(); 
     Thread1 th2=new Thread1(); 
     th.start(); 
     th2.start(); 
     System.exit(1); 
    } 
} 


class Thread1 extends Thread 
{ 
    public void run() 
    { 
     for(int i=0;i<10;i++) 
     { 
      System.out.println(i); 
     } 
    } 
} 

То, что я хотел бы знать, IS-

  • Почему приведенный выше код ничего не печатать? Хотя я создал 2 темы и начал их, но он ничего не печатает. Почему?
  • Если нет ни одной пользовательской нити, например. скажем, обычная программа, состоящая из многих методов, и каждый метод вызывается в методе main(), то как многие потоки создаются по умолчанию, зависит ли это от количества методов , которые у нас есть, или есть один основной поток, который отвечает за вызов всех методов и, наконец, кто создает основной поток, это это JVM, который его создает?

ответ

5

System.exit(1); прекращает выполнение текущей виртуальной машины Java. Когда ваша программа выйдет, ваши потоки также умрут.

Thread является частью Process, если Process вышли, то все темы будут уничтожены.

Thread.join() будет ждать завершения потока.

public class ThreadOne 
{ 
    public static void main(String[] args) 
    { 
     Thread1 th=new Thread1(); 
     Thread1 th2=new Thread1(); 
     th.start(); 
     th2.start(); 
     th.join(); 
     th2.join(); 
     System.exit(1); 
    } 
} 


class Thread1 extends Thread 
{ 
    public void run() 
    { 
     for(int i=0;i<10;i++) 
     { 
      System.out.println(i); 
     } 
    } 
} 
+0

@ chengpohi-Но сначала создаются нити, поэтому они не должны быть мертвыми после выполнения своей задачи. –

+0

@RajMalhotra, 'System.exit (1);' закончат программу правильно? ваши потоки создаются под программным процессом, если этот процесс не существует, все потоки будут уничтожены. – chengpohi

+0

system.exit не убивает JVM – kuhajeyan

1
  1. Ваш код не показывает ничего, потому что вы убиваете приложение с System.exit(), как только он начинает. Вы должны дождаться завершения обоих потоков перед выходом, используя Thread.join(), например.

  2. По умолчанию используется один поток, который выполняет ваш метод main() и создается JVM.

0
To see the numbers being printed on screen add the following: 

try{ 
     th.join(); 
     th2.join(); 
    }catch(Exception e){ 
} 

After th2.start() in main method. 

Как уже указывалось, что Вы должны будете дать время для определяемых пользователем потоков, чтобы завершить свою работу, и это делается путем вызова присоединиться() на соответствующей нити objects.join() обеспечивает что вызывающий поток «Ожидает, что этот поток умрет», прежде чем продолжить.

0

ваши 2 потока запускаются главными потоками, поэтому вызывается 3 потока. но system.exit() убивает ваш основной поток, заставляя другие 2 потока прекратить работу до того, как они получат шанс запустить.

0

Поскольку потоки отделены от основного: основной код продолжает выполняться, и System.exit(1); выполняет без каких-либо проблем с Threads и выключает программу.

1

Поскольку поток не синхронизирован, как обычный Java-код. поэтому после вызова th.start(); th2.start(); он не будет ждать выполнения(), чтобы завершить это, почему System.exit (1); и вы получаете что угодно.

1

вы можете подождать, пока потоки выполнятся с помощью соединения.проверьте следующее

public class ThreadOne 
{ 
public static void main(String[] args) 
{ 
    Thread1 th=new Thread1(); 
    Thread1 th2=new Thread1(); 
    th.start(); 
    th2.start(); 
    try { 
     th.join(); 
     th2.join(); 
    } catch (InterruptedException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
    System.exit(1); 
} 

}

class Thread1 extends Thread 
{ 
public void run() 
{ 
    for(int i=0;i<10;i++) 
    { 
     System.out.println(i); 
    } 
} 

}

1

Согласно ява документы о System.exit

Terminates the currently running Java Virtual Machine. The argument serves as a status code; by convention, a nonzero status code indicates abnormal termination. 

Так выше ваш ответ по поводу первого вопроса. При запуске JVM обычно создается один поток, который вызывает основной, а затем остальные ваши методы. Надеюсь, это поможет.

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