Thread(스레드)
2023. 7. 19. 12:30ㆍJAVA
Thread(스레드) : 동시에 여러 작업을 처리하는 기법
1. Process : 실행중인 하나의 자바 프로그램 [ 본인만의 메모리영역을 가짐(Method, Stack, Heap)] - 프로세스간에는 자원공유 불가
2. Thread : 하나의 프로세스안에서 동작하는 일꾼(직원)같은 개념 - 하나의 프로세스안에서 스레드간에는 자원공유 가능
즉, Thread는 작성되어 있는 코드를 읽어서 실행하는 녀석으로 생각하면 됨.
하나의 프로세스에는 적어도 하나의 스레드가 기본적으로 존재하며 이 스레드를 Main Thread 라고 부름(사장같은 개념)
Thread를 새로 만들지 않는한 Main Thread가 혼자서 위 코드를 읽어서 실행하기에
동시에 실행되지 않고 차례대로 실행됨.
동시에 하려면? 별도의 직원(Thread의 능력을 가진)객체가 필요함
이 직원이 해야할 작업(Task)을 작성해놓은 클래스를 설계
직원채용 - Thread 객체 생성
파일을 다운로드 하면서 음악 재생을 하기위해 다음과 같이 작업했음
//파일 다운로드 작업을 수행하는 직원 클래스 - Thread의 능력을 가진...
class ThreadA extends Thread{
//모든 Thread클래스의 작업은 반드시 이 메소드안에서 작성 해야만 함.
//Thread클래스 안에 원래 있는 run()메소드를 오버라이드 해서 사용해야만 함.
@Override
public void run() {
for(int i=0; i<20; i++) {
String name= Thread.currentThread().getName();
System.out.println(name+" : " + i + "번 파일 다운로드 중....");
//현재 스레드를 0.5초간(500ms) 잠재우기
try {
Thread.sleep(500);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//강제로 시간이 걸리는 느낌을 가지도록..
// for(int k=0; k<2000000000; k++) {
// new String("aaa");
// new String("aaa");
// new String("aaa");
// new String("aaa");
// }
}
}
}
//음악 재생 작업을 수행하는 직원 클래스 - Thread의 능력을 가진...
class ThreadB extends Thread{
@Override
public void run() {
for(int i=0; i<20; i++) {
String name= Thread.currentThread().getName();
System.out.println(name+" : " + i+"번 음악 재생~~");
try {
Thread.sleep(500);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// for(int k=0; k<2000000000; k++) {
// new String("aaa");
// new String("aaa");
// new String("aaa");
// new String("aaa");
// }
}
}
}
public class Main1 {
public static void main(String[] args) {
// TODO Auto-generated method stub
// Thread(스레드) : 동시에 여러 작업을 처리하는 기법
//1. Process : 실행중인 하나의 자바 프로그램 [ 본인만의 메모리영역을 가짐(Method, Stack, Heap)] - 프로세스간에는 자원공유 불가
//2. Thread : 하나의 프로세스안에서 동작하는 일꾼(직원)같은 개념 - 하나의 프로세스안에서 스레드간에는 자원공유 가능
// 즉, Thread는 작성되어 있는 코드를 읽어서 실행하는 녀석으로 생각하면 됨.
// 하나의 프로세스에는 적어도 하나의 스레드가 기본적으로 존재하며 이 스레드를 Main Thread 라고 부름(사장같은 개념)
// Main Thread가 혼자서 위 코드를 읽어서 실행하기에
// 동시에 실행되지 않고 차례대로 실행됨.
// 동시에 하려면? 별도의 직원(Thread의 능력을 가진)객체가 필요함
// 이 직원이 해야할 작업(Task)을 작성해놓은 클래스를 설계
// 직원채용 - Thread 객체 생성
ThreadA a= new ThreadA();
//스레드의 run()메소드 실행은 반드시 start()라는 명령으로 실행해야 함
a.start(); //자동 run()메소드가 발동함
ThreadB b= new ThreadB();
b.start();
//Main Thread도 별도의 작업을 동시에 수행하고 싶다면.
for(int i=100; i<120; i++) {
String name= Thread.currentThread().getName();
System.out.println(name+" : " + i);
try {
Thread.sleep(500);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}//main method..
}//Main class..
메인 스레드에도 작업을 추가하면 총 3개의 스레드가 작업을 수행하는것도 볼 수 있음
'JAVA' 카테고리의 다른 글
| Synchronized기능과 예제 (0) | 2023.07.19 |
|---|---|
| Runnable (0) | 2023.07.19 |
| Collection 클래스들 - Map (0) | 2023.07.18 |
| Collection 클래스들 - Set (0) | 2023.07.18 |
| Colletion 클래스들 - List (0) | 2023.07.18 |