import java.util.*;
public class ThreadA extends Thread {
private String name;
private List<Integer> lstOfInteger;
private int start_i;
public ThreadA(String name, List<Integer> lstOfInteger, int start_i) {
this.name = name;
this.lstOfInteger = lstOfInteger;
this.start_i = start_i;
}
@Override
public void run(){
// this.start_i부터 1씩 증가하며 3개를
// this.lstOfInteger에 넣어 줍니다.
for (int i=this.start_i; i < this.start_i + 3; i++) {
this.lstOfInteger.add(i);
System.out.printf("Name: %s, %s \n", this.name, this.lstOfInteger);
}
}
}
import java.lang.*;
import java.util.*;
public class Main {
public static void main(String[] args) throws Exception {
List<Integer> lstOfInt = new ArrayList<>();
ThreadA threadA = new ThreadA("A", lstOfInt, 0);
ThreadA threadB = new ThreadA("B", lstOfInt, 10);
/*
* threadA, threadB는 각각 동시에 실행됩니다.
* lstOfInt는 두 thread에 의해 공유되는 상태이기 때문에,
* A에서 lstOfInt를 출력했을 때, 이미 B의 결과가 반영된 상황이곤 하죠.
* 즉, non-atomic하다는 이야기입니다.
* .join()을 통해서 실행할 수도 있지만, */
threadA.start();
threadB.start();
}
}
Name: A, [0, 10]
Name: A, [0, 10, 1]
Name: A, [0, 10, 1, 2]
Name: B, [0, 10, 1, 2]
Name: B, [0, 10, 1, 2, 11]
Name: B, [0, 10, 1, 2, 11, 12]
댓글남기기