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();
}
}
'코딩도전기 > JAVA' 카테고리의 다른 글
CODO Day30_JAVA(Network) (0) | 2023.03.16 |
---|---|
CODO Day29_JAVA(Thread 제어) (1) | 2023.03.15 |
CODO Day13_JAVA(Overload/멤버 호출/Static/Final/Import/접근제한자) (0) | 2023.02.17 |
CODO Day12_JAVA(type/method/문자열비교/switch/while/배열/클래스(API/Member(생성자)) (0) | 2023.02.16 |
CODO Day11_JAVA(객체지향언어/변수/scope/casting) (1) | 2023.02.15 |