2011-11-24 8 views
2
public class TowThreads { 
    public static class FirstThread extends Thread { 
     public void run() { 
      for (int i = 2; i < 100000; i++) { 
       if (isPrime(i)) { 
        System.out.println("A"); 
        System.out.println("B"); 
       } 
      } 
     } 

     private boolean isPrime(int i) { 
      for (int j = 2; j < i; j++) { 
       if (i % j == 0) 
        return false; 
      } 
      return true; 
     } 
    } 

    public static class SecondThread extends Thread { 
     public void run() { 
      for (int j = 2; j < 100000; j++) { 
       if (isPrime(j)) { 
        System.out.println("1"); 
        System.out.println("2"); 
       } 
      } 
     } 

     private boolean isPrime(int i) { 
      for (int j = 2; j < i; j++) { 
       if (i % j == 0) 
        return false; 
      } 
      return true; 
     } 
    } 

    public static void main(String[] args) { 
     new FirstThread().run(); 
     new SecondThread().run(); 
    } 
} 

출력 결과에 따르면 FirstThread는 항상 내가 읽은 the article과 반대 인 SecondThread보다 먼저 실행됩니다.왜 FirstThread는 다음 코드에서 SecondThread보다 먼저 실행됩니까?

이유 첫 번째 스레드가 두 번째 스레드보다 먼저 실행해야합니까? 그렇지 않다면 나에게 좋은 모범을 보여줄 수 있습니까? 감사.

답변

5

사용은 당신이 방법을 실행 사용하는 경우

public static void main(String[] args) { 
     new FirstThread().start(); 
     new SecondThread().start(); 
    } 

, 당신은 첫 번째 방법과 두 번째 방법 후 호출이 실행되지 시작합니다. 병렬 스레드를 실행하려면 thread의 start 메소드를 사용해야합니다.

0

글쎄 머신 프로세서와 스레드에 따라 jvm에 달려 있습니다. 읽은 기사에서도 분명히 언급되어 있습니다.

"결과가 컴퓨터마다 다를뿐만 아니라 같은 프로그램에서 여러 번 동일한 프로그램을 실행하면 결과가 달라질 수 있습니다. 다른 스레드가 실행되기 전에 동기화를 사용하여 특정 순서의 실행을 강제하지 않는 한 "

모든 컴퓨터에서 스레드가 동일한 방식으로 작동 할 것으로 기대할 수 없습니다. 그것은 모두 기계가 스케쥴하는 방법에 따라 다릅니다.

+0

실행 코드가 ABABABABAB을 제공합니다 ...... 121212121212하지만 예상대로 ABAB1212AB12AB12AB12A1B2 –

+0

이 맞습니다. run() 메서드를 호출하면 일반적인 메서드를 호출하는 것처럼 호출되므로 그에 따라 작동하지만, 동시에 실행하려면 start() 메서드를 사용하여 호출해야합니다. 그러나 다른 기계에서 스레드의 동작은 다를 수 있습니다. – gprathour

관련 문제