2013-05-13 2 views
0

이 코드는 Java로 작성했지만 결과가 예상과 다른 이유를 이해할 수 없습니다.자바에서 쓰레드가 어떻게 작동합니까?

사과와 오렌지가 왜 어수선하게 만들어 졌는지 설명 할 수있는 사람이 있습니까?

package first_experiment; 

class Orange extends Thread{ 

    public void run(){ 
     for (int i=1 ; i<21 ; i++) 
      System.out.println(i + " - Orange"); 
    } 
} 

class Apple extends Thread{ 

    public void run(){ 
     for (int i =1 ; i <11 ; i++) 
      System.out.println(i + " - Apple"); 
    } 
} 

public class one{ 
    public static void main (String args[]){ 
     Thread O = new Orange(); 
     Thread A = new Apple(); 

     O.start(); 
     A.start(); 
    } 
} 
+1

예상되는 결과를 설명하고 결과를 게시 할 수 있습니까? – djechlin

답변

5

두 스레드가 동시에 실행됩니다. JVM은 인쇄 순서를 결정해야하며 예측할 수있는 순서에 의존 할 수는 없습니다.

+0

Downvoter 설명해주십시오. – djechlin

1

동시에 실행되는 2 개의 스레드를 생성하고 있습니다. 실행 순서는 알 수 없습니다 (둘 다 우선 순위가 같기 때문에). 이 결과, 특정 순서로 표시 루프에서 하나 개의 스레드를 사용하려면

12 - - A ppOranlgee 
// and so on 
0

: PrintStream#println() 다음 동기화되지 않은 경우 출력이 같은 될 것이라고합니다.

여러 스레드를 사용하는 경우 가능한 한 많은 순서로 스레드를 시작하고 실행하려고합니다.

스레드가 너무 짧기 때문에 다른 스레드가 시작되기 전에 스레드가 완료되기 전에 실행 중입니다.

BTW : 사용자가 깜박 거리는 시간에 100,000,000 개의 작업을 수행 할 수 있으며 새 스레드를 시작하는 데 시간이 걸립니다.

0

스레드는 별도의 실행 스트림과 독립 실행 형 스트림으로 실행됩니다. 첫 번째 Orange가 약간의 CPU 시간을 갖기 전에 여러 사과를 반복 할 수 있습니다. 또한 다중 프로세서 시스템에있는 경우, 둘 다 동시에 실행될 수 있습니다.

출력을 조정하려면, wait() 및 notify()를 사용해야합니다.

+0

감사의 말씀 –

-1

스레드는 임의의 순서로 시작될 수 있지만 System.out.println이 스레드 액세스를 동기화하고 인쇄를 위해 하나씩 차례로 실행되기 때문에 결과가 어수선해질 수 있습니다.

정말 임의의 출력을 보려면 목록에 데이터를 저장 한 다음 나중에 목록의 내용을 인쇄하십시오.

0

Java의 스레드는 시작될 때 독립적으로 실행되는 프로세스로 시작된 스레드 코드의 한 줄은 스레드간에 특정 실행 순서없이 시간에 실행됩니다. 위의 코드는 콘솔 카운트 - 오렌지 및 카운트 - Apple에서 무작위로 표시됩니다.

관련 문제