2013-10-26 2 views
3

스레드가 한 번에 하나의 명령문을 완전히 실행하거나 명령문 분할이 수행 될 수 있습니까? 아래 문에서 예를 들어Java : 스레드에서 명령문 실행

:

public void run() { 
    System.out.println(aString + ": " + ++index); 
} 

이 가능한 실행 명령은 무엇입니까?

답변

1

아니요, Thread이 선매 될 경우 보장 할 수 없으므로 진술이 인 경우 을 완료한다고 가정 할 수 없습니다. 실제로 사전 증분 ++index 작업도 중단없이 완료됩니다 (이유는 AtomicInteger입니다).

가능한 실행 명령을 열거하는 것은 프로그램의 한 실행에서 다른 실행으로 계속 변경 될 수 있으므로 사용하지 않아야합니다 (다른 스레드도 실행 중이라고 가정). 그렇기 때문에 우리는 Locksynchronization을 가지고 다중 스레드 코드에 대한 제어력을 향상 시켰습니다.

자세한 내용은 Concurrency을 참조하십시오.

1

명령 레벨에서 언제든지 거의에서 인터럽트가 발생할 수 있습니다. 예를 들어, 문자열 연결은 새로운 문자열의 구성으로 구성되며, 여러 개의 명령어가 사용됩니다.이 중 하나는 잠재적으로 중단됩니다. 인쇄는 잠재적으로 또 다른 명령이 중단 될 수도 있습니다.

다른 스레드로 동작 모습 완료하기 전에 스레드가 코드의 세그먼트를 실행하고 싶은 경우

동기화 키워드
http://docs.oracle.com/javase/tutorial/essential/concurrency/syncmeth.html

또는 잠금세마포어
http://docs.oracle.com/javase/tutorial/essential/concurrency/newlocks.html
http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/Semaphore.html

1

코드/문장이 다른 스레드에 의해 중단되지 않을 것이라는 보장은 없습니다. 하지만 당신은 동기화 된 블록을 사용할 수 있습니다 -

public void run() 
{ 
    synchronized(this) { 
     System.out.println(aString+ ": " + ++index); 
    } 
} 

이 더 스레드가 인쇄되는 동안 다른 스레드를 방해하려고 없는지 확인합니다.

+0

마지막 진술이 올바르지 않습니다. synchronized 키워드는 다른 스레드가 현재 실행중인 스레드를 인터럽트하지 못하도록하지만 동일한 객체 또는 메소드에서 동기화 된 메소드를 실행하려고 시도하는 다른 모든 스레드를 대신 차단합니다. 여기에서 확인할 수 있습니다. http://docs.oracle.com/javase/tutorial/essential/concurrency/syncmeth.html – Tyler