2014-04-13 2 views
1

프로그램을 실행할 때마다 다른 출력을 제공하는 이유는 무엇입니까?간단한 스레드 프로그램 실행시 다른 출력

package threading; 
class RunnableDemo implements Runnable { 

    @Override 
    public void run() { 
     go(); 
    } 

    public void go() { 
     String name = Thread.currentThread().getName(); 
     System.out.println(name + "Run method"); 
    } 
} 

public class multiThreading { 
    public static void main(String[] args) { 
     Runnable myJob = new RunnableDemo(); 
     Thread job1 = new Thread(myJob); 
     Thread job2 = new Thread(myJob); 
     job1.setName("Job1"); 
     job2.setName("Job2"); 
     job1.start(); 
     job2.start(); 
     System.out.println("Main Method"); 
    } 
} 

또한 작업 1 스레드가 설정 이름을 표시하지 않습니다. @anonymous가 지적 하듯이

출력

Job2Run 방법
홈페이지 방법
스레드 1Run 방법

+2

당신이'job1.setName()'두 번 있었기 때문에! – anonymous

+0

코드를 올바르게 들여 쓰고 Java 명명 규칙을 존중하여 좋은 질문을하는 시간을 가지십시오. 변수는 소문자로 시작합니다. –

답변

0

당신은 두 번 하나 개의 스레드를 설정합니다. 그것은 다른 출력을 내가 프로그램을 실행할 때마다주고 왜

대신 당신은

Thread job1 = new Thread(myJob, "Job1"); 
Thread job2 = new Thread(myJob, "Job2"); 

을 수행해야합니다.

예상되는 결과를 설명 할 수 있습니까? 의도적으로 모든 순서로 실행할 수있는 두 개의 독립 스레드를 시작했습니다.


어떤 스레드로부터 안전하지 않습니다?

Thread.setName() 및 Thread.getName()은 스레드로부터 안전하지 않습니다. 소스에서

private char  name[]; 

public final void setName(String name) { 
    checkAccess(); 
    this.name = name.toCharArray(); 
} 

public final String getName() { 
    return String.valueOf(name); 
} 

즉, 하나의 스레드에서 값을 설정할 수 있지만 변경 사항은 표시되지 않음을 의미합니다.

참고 :이 경우 스레드를 시작하기 전에 이름을 설정하기 때문에이 경우 문제가되지 않습니다. 스레드가 시작되기 전에 작성된 것은 모두 표시 될 수 있습니다.

+2

스레드로부터 안전하지 않은 것은 무엇입니까? –

+0

우리는 또한 메서드 동기화를 통해 스레드를 안전하게 만들 수 있습니다. :-) –

+0

@Mubeen true 또는 다른 스레드의 스레드 이름을 설정하는 것이 가장 좋은 방법은 아닙니다. –

0

당신은 작업 2 스레드의 이름을 설정하지 않은 :

Job1.setName("Job1"); 
Job1.setName("Job2"); 
Job1.start(); 
Job2.start(); 

올바른은 다음과 같습니다

Job1.setName("Job1"); 
Job2.setName("Job2"); 
Job1.start(); 
Job2.start(); 
관련 문제