본문 바로가기
코딩도전기/JAVA

CODO Day29_JAVA(Multi Thread)

by 코도꼬마 2023. 3. 14.

Multi Thread

  • Thread는 어떤 program을 실행하게 해주는 원동력
  • 대표적으로 main(String[] args) 는 thread를 동작하게 해주는 method(없으면 실행X)

 

Process Thread의 관계

  • Process는 1개 이상의 Thread로 구성되어 있음
  • 가장 대표적인 차이는 memory Share 여부
    • Process 간에는 memory Share가 되지 않으나 Thread 간에는 가능
  • Process가 하나의 웹 브라우저라고 가정하면 Thread는 브라우저 안에 열려있는 탭으로 볼 수 있음
  • 웹 브라우저는 하나의 process로 동작하지만, 각 탭은 각각의 thread로 동작하기 때문
  • 각 탭에서는 동시에 여러 작업이 이루어지지만 하나의 브라우저 창에서 같은 자원을 공유함

 

Multi Thread

  • main method는 main Thread를 생성하는데, main Thread가 자신을 위해 일 할 work Thread를 생성하는 것

 

Thread 생성방법

  • Runnable interface 구현 or Thread class 상속
  • 두 방법 모두 익명(Anonymous)객체를 활용할 수 있음

 

Runnable interface 구현

  • Job
package chap01.ex01;

public class Job implements Runnable {

	@Override
	public void run() { //thread에게 시킬 일
		
		for (int i = 0; i < 5; i++) {
			System.out.println("workThread 일 하는 중..");
			try {
				Thread.sleep(1000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}

	}

}

 

  • Main
package chap01.ex01;

public class Main {
	//main 메서드가 있어야 자바프로그램이 실행됨
	public static void main(String[] args) {
		System.out.println("메인 실행");
		
		//1.해야할 일 정하기
		Job job = new Job();
		
		//2.workThread 생성
		Thread workThread = new Thread(job);
		
		//3.workThread 실행
		workThread.start();  //thread를 시작하고 run() 호출
		
		//mainThread 스스로 일하기
		for (int i = 0; i < 5; i++) {
			System.out.println("mainThread 일 하는 중...");
			try {
				Thread.sleep(1000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}  //실행 시 main과 work thread의 실행 순서가 섞임(비동기성-실행이 끝날때까지 기다리지x)
		}
	}

}

 

  • AnonyMain
package chap01.ex01;

public class AnonyMain {

	public static void main(String[] args) {
		
		//2.워크스레드 생성(한번 사용할 경우 익명객체로 객체화)
		Thread work = new Thread(new Runnable() {
			
			@Override
			public void run() { //1.워크스레드가 할 일 정하기
				for (int i = 0; i < 5; i++) {
					System.out.println("work thread"+i);
					try {
						Thread.sleep(1000);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
				}
			}
		});		
		//3.워크스레드 실행
		work.start();
		
		//main thread가 할 일
		for (int i = 0; i < 5; i++) {
			System.out.println("main thread"+i);
			try {
				Thread.sleep(1000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}

}

 

 

Thread class 상속

  • Job
package chap01.ex02;

public class Job extends Thread {

	@Override
	public void run() {
		for (int i = 0; i < 5; i++) {
			System.out.println("workthread"+i);
			try {
				Thread.sleep(1000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}

}

 

  • Main
package chap01.ex02;

public class Main {

	public static void main(String[] args) {
		//1.워크스레드 해야할 일 생성 + 워크스레드 생성
		Thread work = new Job();
		
		//2.워크스레드 실행
		work.start();
		
		
		//mainThread가 해야할 일
		for (int i = 0; i < 5; i++) {
			System.out.println("main thread" + i);
			try {
				Thread.sleep(1000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}

}

 

  • AnonyMain
package chap01.ex02;

public class AnonyMain {

	public static void main(String[] args) {
		
		Thread work = new Thread() { //익명객체 사용
			@Override
			public void run() {
				for (int i = 0; i < 5; i++) {
					System.out.println("Work Thread" + i);
					try {
						Thread.sleep(1000);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
				}
			} 			
		};
		work.start();
		
		for (int i = 0; i < 5; i++) {
			System.out.println("Main Thread" + i);
			try {
				Thread.sleep(1000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}

	}

}

 

 

Thread Name

  • Thread가 여러개일 경우 각각의 이름이 필요
  • 이름을 지정하지 않으면 Thread-n(0부터 시작) 형태의 이름이 자동 지정됨
  • 다른 이름을 지정하고 싶으면 setName(name)을 사용(Thread는 static으로 선언되었기 때)

 

  • Job
package chap01.ex03;

public class Job extends Thread {

	@Override
	public void run() {
		for (int i = 1; i <= 5; i++) {
			System.out.println(getName()+" : "+i);
		}
	}

}

 

  • Main
package chap01.ex03;

public class Main {

	public static void main(String[] args) {
		
		Thread work = new Job();
		work.setName("첫째");
		work.start();
		
		work = new Job();
		work.setName("둘째");
		work.start();
		
		work = new Job();
		work.setName("막내");
		work.start();
	}

}