국비과정/JAVA
20230629 _[20일차]_01. 스레드 + 동기화
phyho
2023. 6. 29. 12:32
[ 멀티스레드 ]
package threadEx;
public class Thread03 extends Thread {
int seq;
public Thread03(int seq) {
this.seq = seq;
}
@Override
public void run() { // 오버라이드 해서 적어줍니다.
System.out.println(this.seq + "번쨰 스래드 시작");
try {
Thread.sleep(1000);
} catch (Exception e) {
e.printStackTrace();
} // 1초
System.out.println(this.seq + "번째 스래드 끝");
}
public static void main(String[] args) {
System.out.println("Main메소드 시작");
for (int i = 0; i < 11; i++) {
Thread03 thread03 = new Thread03(i);
thread03.start();
}
System.out.println("Main메소드 끝");
}
}
메인 메소드 따로 스레드 따로여서 main이 끝나고 스레드는 계속 자기 할일을 하고있음 순서가 안맞아!
Main메소드 시작
0번쨰 스래드 시작
1번쨰 스래드 시작
3번쨰 스래드 시작
4번쨰 스래드 시작
5번쨰 스래드 시작
Main메소드 끝
2번쨰 스래드 시작
6번쨰 스래드 시작
7번쨰 스래드 시작
10번쨰 스래드 시작
9번쨰 스래드 시작
8번쨰 스래드 시작
10번째 스래드 끝
2번째 스래드 끝
7번째 스래드 끝
9번째 스래드 끝
5번째 스래드 끝
8번째 스래드 끝
3번째 스래드 끝
4번째 스래드 끝
6번째 스래드 끝
1번째 스래드 끝
0번째 스래드 끝
( 동기화 ) _ join()
ArrayList 인 al 객체생성
thread03을 al에 담기 (start() 아래쪾에)
for문으로 al에 담은것들을 다시 t에 넣어주기 (t에 join걸기위해서)
t.join(); -> try/catch 걸어주기
동기화되어 Main메소드로 출력이 끝남
package threadEx;
import java.util.ArrayList;
public class Thread03 extends Thread {
int seq;
public Thread03(int seq) {
this.seq = seq;
}
@Override
public void run() { // 오버라이드 해서 적어줍니다.
System.out.println(this.seq + "번쨰 스래드 시작");
try {
Thread.sleep(1000);
} catch (Exception e) {
e.printStackTrace();
} // 1초
System.out.println(this.seq + "번째 스래드 끝");
}
// 동기화 join : 스레드가 모두 종료된 후에 main을 종료하겠습니다.
public static void main(String[] args) {
System.out.println("Main메소드 시작");
ArrayList<Thread03> al = new ArrayList<Thread03>();
for (int i = 0; i < 11; i++) {
Thread03 thread03 = new Thread03(i);
thread03.start();
al.add(thread03); // 리스트에 담아요.
}
for (int i = 0; i < al.size(); i++) {
Thread03 t = al.get(i);
try {
t.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("Main메소드 끝");
}
}
Main메소드 시작
0번쨰 스래드 시작
1번쨰 스래드 시작
2번쨰 스래드 시작
4번쨰 스래드 시작
6번쨰 스래드 시작
3번쨰 스래드 시작
9번쨰 스래드 시작
10번쨰 스래드 시작
5번쨰 스래드 시작
7번쨰 스래드 시작
8번쨰 스래드 시작
7번째 스래드 끝
5번째 스래드 끝
0번째 스래드 끝
10번째 스래드 끝
9번째 스래드 끝
3번째 스래드 끝
4번째 스래드 끝
2번째 스래드 끝
1번째 스래드 끝
6번째 스래드 끝
8번째 스래드 끝
Main메소드 끝
[ 동기화메소드 & 공유객체 ] _ 책 p. 533
( User1 )
package threadEx;
public class User1 extends Thread {
private Calculator calculator;
public Calculator getCalculator() {
return calculator;
}
public void setCalculator(Calculator calculator) {
this.setName("user1");
this.calculator = calculator;
}
public void run() {
calculator.setMemory(100);
}
}
private Calculator calculator; 로 가져오면 -> getter/setter 필요
( User2 )
package threadEx;
public class User2 extends Thread {
private Calculator calculator;
public Calculator getCalculator() {
return calculator;
}
public void setCalculator(Calculator calculator) {
this.setName("user2");
this.calculator = calculator;
}
public void run() {
calculator.setMemory(50);
}
}
( MainThreadEx ) _ user 1 & 2 가져와서 calculator 실행
package threadEx;
public class MainThreadEx {
public static void main(String[] args) {
Calculator calculator = new Calculator();
User1 user1 = new User1();
user1.setCalculator(calculator);
user1.start();
User2 user2 = new User2();
user2.setCalculator(calculator);
user2.start();
}
}
( calculator )
package threadEx;
public class Calculator {
private int memory;
public int getMemory( ) {
return memory;
}
public void setMemory(int memory) {
this.memory = memory;
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + ": " + this.memory);
}
}
실행하면 값이 100과 50으로 다른데 동기화로 같아져있음
user1: 50
user2: 50
( 동기화 메소드 synchronized 추가 )
package threadEx;
public class Calculator {
private int memory;
public int getMemory( ) {
return memory;
}
public synchronized void setMemory(int memory) {
this.memory = memory;
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + ": " + this.memory);
}
}
user1: 100
user2: 50
*** 책에 있는 내용 읽어보기
스레드 제어 p.541
데몬스레드 p.549