package test.thread1;
public class TestFristThread {
public static void main(String[] args) throws InterruptedException {
// TODO Auto-generated method stub
// new Thread() {
// public void run() {
// System.out.println("Sub Thread :: " + Thread.currentThread());
// }
// }.start();
// System.out.println("Main Thread :: " + Thread.currentThread());
class Target implements Runnable{
@Override
public void run() {
System.out.println("Sub Thread :: " + Thread.currentThread());
}
}
Runnable target = new Target();
Thread cpu = new Thread(target);
cpu.start();
Thread.yield();
// Thread.sleep(50);
cpu.join();
System.out.println("Main Thread :: " + Thread.currentThread());
}
}
-join()메서드를 사용하게 되면 해당되는(other)쓰레드들이 다 끝난 후에 현재 쓰레드가 실행하게 된다.
∴ Sub Thread가 먼저 실행이 되고 Main Thread가 나중에 실행되게 된다.
package test.thread1;
public class TestSyncThread {
public static void main(String[] args) throws InterruptedException {
Counter monitor = new Counter();
Runnable target = new Target(monitor);
Thread cpu1 = new Thread(target);
Thread cpu2 = new Thread(target);
Thread cpu3 = new Thread(target);
cpu1.start(); cpu2.start(); cpu3.start();
cpu1.join(); cpu2.join(); cpu3.join();
System.out.println(monitor);
}
}
class Counter{
private int count;
public synchronized void inc() {
count++;
}
public String toString() {
return "monitor = " + count;
}
}
class Target implements Runnable{
private Counter monitor;
Target(Counter monitor){
this.monitor = monitor;
}
public void run() {
for (int i = 0; i < 100000000; i++) {
monitor.inc();
}
System.out.println(Thread.currentThread()+" :: "+ monitor);
}
}
<synchronized를 쓰는 이유>
-멀티 쓰레드의 경우, 여러 쓰레드가 같은 프로세스 내의 자원을 공유해서 사용
-여러 쓰레드가 같이 공유하는 경우, 한 쓰레드가 작업하던 도중 cpu할당이 끝나고 다른 쓰레드로 넘어가서 공유데이터를 변경하게 되면 다시 작업으로 돌아왔을 때 원래 의도했던 결과와 다른게 나옴.
*synchronized 하지 않았을 때 결과 값
-따라서 synchronized를 통해서 한 쓰레드의 작업이 끝날때까지 간섭하지 못하게 하여 데이터 유실을 막을 수 있다.
'연습문제 및 실습 자료' 카테고리의 다른 글
정렬 만들기 (0) | 2023.08.22 |
---|---|
쓰레드 2 (0) | 2023.08.21 |
날짜 클래스 만들기 - 일정관리 프로그램(1) (0) | 2023.08.17 |
아이스크림 심부름 문제 - 기초 알고리즘 (0) | 2023.08.16 |
EMS 토이프로젝트 (0) | 2023.08.14 |