2014-01-16 1 views
-2

완전한 참고서를 사용하여 Java를 배우고 있습니다. 저는 지금 Multithreded Programming Concept에 있습니다. 이 프로그램의 실행 단계를 이해하는 데 도움을주십시오.프로그램 이해를위한 도움이 필요합니다.

// This program is not synchronized. 
class Callme { 
    void call(String msg) { 
    System.out.print("[" + msg); 
    try { 
     Thread.sleep(1000); 
    } catch(InterruptedException e) { 
     System.out.println("Interrupted"); 
    } 
    System.out.println("]"); 
    } 
} 

class Caller implements Runnable { 
    String msg; 
    Callme target; 
    Thread t; 

    public Caller(Callme targ, String s) { 
    target = targ; 
    msg = s; 
    t = new Thread(this); 
    t.start(); 
    } 

    public void run() { 
    target.call(msg); 
    } 
} 

class Synch { 
    public static void main(String args[]) { 
    Callme target = new Callme(); 
    Caller ob1 = new Caller(target, "Hello"); 
    Caller ob2 = new Caller(target, "Synchronized"); 
    Caller ob3 = new Caller(target, "World"); 

    // wait for threads to end 
    try { 
     ob1.t.join(); 
     ob2.t.join(); 
     ob3.t.join(); 
    } catch(InterruptedException e) { 
     System.out.println("Interrupted"); 
    } 
    } 
} 

논리를 이해할 수 없습니다.

+0

@HighCore 님이 귀하의 의견을 이해할 수 없었습니다. – user3203399

+0

@HighCore Java는 동기화/대기 설정도 지원하지만 선택하면 Runnable 클래스를 서브 클래스화할 수도 있습니다. 어쨌든 일반적으로 Java에서는 동기화/대기를 사용하거나 데이터를 저장하는 경우 휘발성 변수 유형을 사용할 수 있습니다. –

+0

@dylanlawrence ** ['async/await'] (http://msdn.microsoft.com/en-us/library/hh191443.aspx)/계속 ** 언어 수준 ** 지원의 아름다움에 가까운 아무 데나 ** C#에서. –

답변

0

좋아,이 코드의 단계별 개요를하자 : Callme, 발신자와 동기화 : 당신은 세 가지 클래스가,

첫째. 당신의 주요 방법은 Synch에 있습니다. 시작하겠습니다. 주 메서드에서 Callme을 인스턴스화 한 다음 호출자 개체를 세 개 만듭니다. 는 이제, 발신자 생성자를 보자 :

public Caller(Callme targ, String s) { 
    target = targ; 
    msg = s; 
    t = new Thread(this); 
    t.start(); 
    } 

당신이 Callme와 생성자에 전달되는 사용자 정의 문자열을 설정 한 다음 방금 인수로 생성 된 발신자 객체를 전달, 새로운 스레드를 생성합니다.

t.start를 호출하면 이미 실행중인 주 스레드와 병렬로 실행되는 또 다른 실행 스레드가 시작됩니다. 또한, start는 내부적으로 Thread 생성자에 전달한 호출자 객체에있는 run 메소드를 호출합니다. 이제 다른 두 호출자 개체 을 인스턴스화하고 나머지 주 메서드를 실행하는 동안 호출자 스레드가 단독으로 실행됩니다. 세 발신자 개체 instantianting 후, 주요 메소드 호출은 각 발신자에 조인 할 조인 무엇

try { 
    ob1.t.join(); 
    ob2.t.join(); 
    ob3.t.join(); 
} catch(InterruptedException e) { 
    System.out.println("Interrupted"); 
} 

는이 세 가지 다른 스레드는 계속하기 전에 실행을 종료하는 실행을 중지하고 기다리고 메인 스레드를 알 수 있습니다.

이제 Caller run 메서드로 돌아가서 어떻게해야하는지 알아 보겠습니다. 여기

void call(String msg) { 
    System.out.print("[" + msg); 
    try { 
     Thread.sleep(1000); 
    } catch(InterruptedException e) { 
     System.out.println("Interrupted"); 
    } 
    System.out.println("]"); 
    } 

당신이 인수로 전달할 사용자 정의 메시지를 인쇄하고 (1 초 이상 currrent 스레드 수면을 인쇄 :

실행 당신이 생성자에서 설정 한 CallMe 참조에 메소드 호출을 호출 마지막 괄호를 인쇄하기 전에 시간이 더 걸릴 수도 있습니다).

요약 : 메인 메서드에서 3 개의 Caller 개체를 만들고 각각 Callme 개체를 만들고 기본 메서드가 실행되는 동안 (Thread.join 메서드에 도달 할 때까지) 각 호출자 스레드는 자신의 스레드를 실행합니다 CallMe 전화 법 사본();

관련 문제