저는 스스로 학습하는 자바이고 멀티 스레딩을 이해하고 싶습니다. 나는 MyThread
클래스를 작성하여 조건이 참이 될 때까지 루프를 수행 한 다음 그에 대한 정보를 인쇄합니다. 여기에는 생성자에서 증가되고 작업이 완료 될 때 감소하는 정적 필드 left
이 포함됩니다. 클래스 Flag
은 시작 시점을 '알리는'것입니다. 불행히도 모든 스레드가 완료되면 left
은 0이 아닙니다. 나는 몇 가지 방법을 만들었습니다. synchronized
그리고 더 나아졌지만 여전히 완벽하지는 않습니다. 내가 뭘 잘못하고 있니?자바에서 동기화 멀티 스레딩
import java.util.Random;
class Flag
{
private boolean ok = false;
synchronized boolean ok()
{
return ok;
}
synchronized void setOk(boolean ok)
{
this.ok = ok;
}
}
class MyThread extends Thread
{
static int left = 0;
synchronized void add()
{
left++;
}
synchronized int remove()
{
return --left;
}
String name;
Flag flag;
Random rnd = new Random();
public MyThread(String name, Flag flag)
{
this.name = name;
this.flag = flag;
add();
}
public void run()
{
while(!flag.ok());
double rnd;
long count = 0;
do{
count++;
rnd = Math.random();
} while(rnd > 0.00001);
print(count);
}
synchronized void print(long count)
{
System.out.printf("%s %10d left: %3d%n", name, count, remove());
}
}
public class Test
{
public static void main(String... args) throws Exception
{
Flag flag = new Flag();
for(int i=0; i<2000; i++){
new MyThread(String.format("%04d",i),flag).start();
}
flag.setOk(true);
}
}
예상되는 출력은 무엇입니까? – Arpit
마지막 줄에는 lke'1540 243385 left : 0'을보고 싶습니다. 그것은 (왼쪽에서) 쓰레드 이름, 카운터 (루프에 얼마나 많은 반복이 있었는지)와 0 (남은 쓰레드 수)입니다. 대신 '1540 243385 left : 5'와 같은 것을 얻습니다. –