2017-05-13 2 views
1

왜 프로그램이 0 대신 9를 인쇄하지 않습니까? clases 모두의 Integer i는 서로 독립적 입니다 당신은 threadOnei를 인쇄하고, 그리고 firstThread스레드에서의 카운팅

:
AtomicInteger는 (권고로)

public class threadOne{ 
    //Integer i=0; 
    AtomicInteger i=new AtomicInteger(0); 

    class firstThread implements Runnable{ 
     AtomicInteger i; 
     firstThread(AtomicInteger i){ 
      this.i=i; 
     } 
     public void run(){ 
      while(i.intValue()<10){ 
       i.incrementAndGet(); 
      } 
     }  
    } 

    void runThread(){ 
     Thread t = new Thread(new firstThread(i)); 
     t.start(); 
     System.out.println("Result : " + i.intValue()); 
    } 

    public static void main(String[] args){ 
     new threadOne().runThread(); 

    } 

} 
+0

내 대답 읽기. 그리고 문제가 해결되지 않으면 대답을 받아들이지 마십시오. 그것은 문제가 해결되고 모두가 나아 간다는 인상을줍니다. –

+0

내 대답이 업데이트되었습니다. –

+1

참조 Java 명명 규칙을 따르십시오. 항상 클래스 이름은 대문자로 시작하십시오. 또한,'threadOne'은'Thread'를 확장해야합니다. 이름에서 알 수 있듯이 말입니다. –

답변

1

을 기억 도움이되지 않았다 . 하나의 변화는 다른 하나의 변화를 반영하지 않습니다. Integer은 변경 불가능한 클래스입니다. 예를 들어

,

Integer i = 4; 
Integer j = i; 
j = 1; //same as j = new Integer(1); 
System.out.println(i); 

4하지 1 인쇄합니다. 같은 방법으로 i+=1 (firstThread)은 인쇄중인 threadOnei에 영향을주지 않습니다.

당신은 당신이 예상, 또는 단순히 i의 인쇄 무엇을 수행하는 AtomicInteger 같이 변경 가능한 클래스를 사용할 수 있습니다 firstThread

편집 : 당신은 변경 사항을 확인 완료 스레드의 실행을 위해 기다릴 필요 . 수행

Thread t = new Thread(new firstThread(i)); 
t.start(); 
try{ 
    t.join(); 
}catch(Exception e){} 
System.out.println("Result : " + i.get()); 
+0

이 질문은 ** AtomicInteger **와는 전혀 관련이 없습니다. 그것은 동시 액세스를위한 것입니다. 이것은 단지 혼란 스럽습니다. –

+0

아직 해결되지 않았습니다. 당신은 요점을 얻지 못했습니다. –

+0

@pulp_fiction 내가 'AtomicInteger'를 언급 한 이유는 그것이 변형 될 수 있기 때문입니다. 즉,이 예에서 OP가 제안한 것처럼 '9'가 인쇄됩니다. –

0

문,

System.out.println("Result : " + i);

threadOne 클래스의 필드 i을 의미하고 당신이 firstThread 클래스의 증가 i 대신 인쇄 무엇 때문입니다. 당신이 i라는 두 변수를 선언하기 때문이다의 firstThread 클래스 내부에이 사항이 9

그래서 그런 짓을 얻을

public void run(){ 
     while(i<10){ 
      i+=1; 
     } 
     // INSERT HERE 
     System.out.println("Result : " + i); 
    } 
0

를 삽입합니다. 무슨 일이 있었 기본적으로 어떤

public class threadOne{ 
    Integer i=0; // <--- first one here 
    class firstThread implements Runnable{ 
     Integer i; // <--- second one here 
     firstThread(Integer i){ 
      this.i=i; // <--- here you are accessing the second one 
     } 
     public void run(){ 
      while(i<10){ 
       i+=1; // <--- here you are accessing the second one 
      } 
     }  
    } 
    void runThread(){ 


     Thread t = new Thread(new firstThread(i)); // <--- here you are accessing the first one 
     t.start(); 
     System.out.println("Result : " + i); // <--- here you are accessing the first one 

    } 
    public static void main(String[] args){ 
     new threadOne().runThread();  
    } 

} 

어떤 스레드가 변화하는 것은 두 번째 i 동안 첫 번째 i을 밖으로 인쇄하는 것입니다.

간단하게이 일을하여 두 번째 i를 인쇄이 문제를 해결하려면 다음

firstThread first = new firstThread(i); // we need a firstThread variable because we need to access the second i later 
Thread t = new Thread(first); 
t.start(); 
System.out.println("Result : " + first.i); 
0

Integer 클래스는 불변이다. 외부에서 값을 전달할 수없고 새로운 값을 반환하지 않고 메서드 내에서 값을 변경할 수 없습니다.