2017-03-21 1 views
-2

스레딩 개념을 사용하여 다음 코드를 시도했습니다.이 코드에서는 두 개의 다른 클래스에서 두 개의 실행 메서드를 선언했습니다. 내 주요 방법에서 그 방법을 호출했습니다. 사실 내가 알고 싶은 것은, 어느 run() 메서드가 먼저 호출 되었습니까? 나는 여러번 반복해서 실행될 때 같은 코드에 대해 다른 결과를 얻었습니다.어떤 클래스 run() 메서드가 먼저 호출 되었습니까? 그리고 왜?

내 코드 :

class parent 
{ 
    public synchronized void display1() 
    { 
     System.out.println("Dispaly_1 is invoked"); 
    } 
    public synchronized void display2() 
    { 
     System.out.println("Dispaly_2 is invoked"); 
    } 
} 
class abc extends Thread{ 
    parent p; 
    public abc(parent p){ 
     this.p = p; 
    } 

    public void run(){ 
     System.out.println("abc start...");  
     p.display1(); 
    } 
} 
class xyz extends Thread{ 
    parent p; 
    public xyz(parent p){ 
     this.p = p; 
    } 

    public void run(){ 
     System.out.println("xyz start...");  
     p.display2(); 
    } 
} 

public class ThreadExample { 

    public static void main(String[] args) { 

     parent p=new parent(); 
     abc ob=new abc(p); 
     xyz ob1=new xyz(p); 
     ob.start(); 
     ob1.start(); 

    } 

} 

출력 : 1 시간

abc start... 
xyz start... 
Dispaly_2 is invoked 
Dispaly_1 is invoked 

2 시간

xyz start... 
Dispaly_2 is invoked 
abc start... 
Dispaly_1 is invoked 

3 시간

abc start... 
Dispaly_1 is invoked 
xyz start... 
Dispaly_2 is invoked 
,536,

이 출력과 혼동 스럽습니다. 누구나이 코드 결과를 설명 할 수 있습니다. 귀하의 도움을 고맙게 생각합니다. 감사합니다.

+9

스레드는 비동기 적으로 실행되며 서로에 대한 정확한 순서는 예측할 수 없습니다. 그것이 바로 그 방법입니다. – markspace

답변

5

어떤 run() 메소드가 먼저 호출 되었습니까?

어느 쪽이든.

왜요?

불확정합니다. 최대 스레드 스케줄러.

순차 실행을 원할 경우 스레드를 사용하지 마십시오.

1

모두 스케줄러에 달려 있습니다. 스레드는 독립적으로 스케쥴러에서 관리 할 수 ​​있습니다. 먼저 abc 스레드를 시작하면 xyz가 먼저 스케쥴러에서 실행되거나 그 반대가 될 수 있습니다.

처음 시작된 스레드는 항상 처음에는 실행되지 않습니다.

희망은 내 대답은 스케줄러에 대한 명확성을 제공합니다.

관련 문제