당신이 제공 한 것이 최선의 답입니다. 첫 번째 경우에는 아마 오류가 발생할 것입니다. 두 번째 방법은 완전히 안전합니다 (물론 안전하지 않은 일을하지 않는다고 가정 할 때).
내가 아는 한별로 도움이되지 않으므로 배경을 알려 드리겠습니다.
class NewThread implements Runnable {
void run(){
//do something
}
}
지금, 우리는 실제 구현 무엇 모르겠지만, 우리는 여전히 몇 가지 분석을 할 수 있습니다 : 그것은이 같은 방법 무효 실행()를해야하므로
NewThread는 대부분의 아마, Runnable를 구현합니다. 예제의 전체 결과는 NewThread가 상태 저장인지 또는 상태 저장인지에 따라 다릅니다. "Stateful"은 해당 클래스의 인스턴스에 상태 (예 : 일부 내부 필드 (특성))가 있음을 의미합니다. "무국적자"는 단지 "상태가 없다".
NewThread가 상태 비 저장 인 경우 결과는 동일하게됩니다. ExecutorService 아래에서 새 스레드에서 run() 메소드를 실행하며 어쨌든 변수 상태가 없으므로 아무런 문제가 없습니다.
NewThread가 상태 저장 인 경우 첫 번째 예제에 몇 가지 문제가있을 수 있습니다. 컴파일러는 코드가 정상이지만 여기서는별로 도움이되지 않지만 논리가 깨질 수 있습니다. 상상해보십시오 :
class NewThread implements Runnable {
int x = 0;
void run(){
while (x<10)
x = x + 1;
}
}
여기에 표시되는 내용은 경쟁 조건 핸드북의 예입니다. 나보다 나은 저자는 저보다 더 나은 방법으로 문제를 설명했습니다. 따라서 this, this 및 this과 같은 링크를 제공 할 것입니다. 물론 Google을 사용하십시오. 기본적으로,이 경우의 경쟁 조건은 x = x + 1 일 때 먼저 x를 읽고 나서 쓰기를해야한다는 것입니다. 읽기와 쓰기 사이에 다른 스레드가 x의 값을 수정했을 수 있으며이 스레드가이 값을 덮어 쓰게됩니다.
NewThread가 상태 유지이지만 여전히 올바르게 작동하는 경우가 있습니다.
이 이 이
class NewThread implements Runnable {
AtomicInteger x = new AtomicInteger(0);
void run(){
while (x<10)
x.incrementAndGet(); //getAndIncrement would work too - we don't care about the result, only about incrementing
}
}
이 이 이
는 "원자"란 그 클래스의 모든 작업이 간주됩니다 : 중 synchronized 키워드를 사용하여 (예를 들어, 위의 3 링크 참조) 또는 동기화 된 데이터 구조를 사용하여 - 당신은 당신의 코드에 의해 직접 동기화하는 경우에 발생합니다 읽기 또는 쓰기와 같은 단일 단계 (x = x + 1은 두 단계이므로 정확히 경쟁 조건으로 연결됩니다). 이미 사용 가능한 원자 클래스가 여러 개 있습니다 in JDK. 비슷한 것을 구현하고 싶다면 synchronized keyword 또는 일부 lock-like object을 사용하여 변수를 보호 할 수 있습니다.
'run()'메소드가 무엇을하는지에 따라 다릅니다. 참고 : 두 경우 모두'NewThread'를 시작하지 않으므로 실제로 실행되지 않습니다. Thread 객체를 만드는 것은 시작과 동일하지 않습니다. –
당신이 얻을 것은 전적으로 NewThread의 코드에 달려 있습니다. –