[0905] 자바 스레드 (스레드의 생성/실행, 스레드의 이름)
#스레드
- 프로세스와 스레드
▪ 프로세스 : 실행 중인 애플리케이션. 실행에 필요한 만큼의 메모리를 할당받음.
▪ 프로세스의 구성 : 데이터, 컴퓨터 자원, 스레드로 구성됨
▪ 스레드 : 스레드는 데이터와 애플리케이션이 확보한 자원을 활용하여 소스 코드를 실행함. 즉 코드 실행 흐름과 같음
- 메인 스레드
▪ 메인 스레드는 자바 실행 시 가장 먼저 실행되는 main 메서드를 실행시킨다.
▪ main 메서드의 코드의 끝을 만나거나 return문을 만나면 실행을 종료한다.
▪ 소스 코드가 싱글 스레드라면 프로세스는 실행 중 하나의 스레드만 작동시키는 싱글 스레드 프로세스가 된다.
- 멀티 스레드
▪ 멀티 스레드 프로세스란 여러 개의 스레드를 가진 프로세스를 말한다.
▪ 여러 스레드가 동시에 작업을 수행하고 있는 것을 멀티 스레딩이라고 한다.
- 작업 스레드 생성과 실행
▪ 작업 스레드란, 메인 스레드 외에 별도의 스레드를 생성하여 코드를 실행시키는 것을 말한다.
▪ 클래스 내부에 run() 메서드를 활용하여 스레드가 처리할 작업을 작성한다.
(1) Runnable 인터페이스를 구현한 객체에서 run()을 구현
public class ThreadExample1 {
publicc static void main(String[] args {
// Runnable 인터페이스 구현한 객체
Runnalbe task1 = new ThreadTask1();
// Runnable 구현 객체를 인자로 전달하여 Thread 클래스 인스턴스화 하여 스레드 생성
Thread thread1 = new Thread(task1);
// 위 과정을 축약한 코드: Thread thread1 = new Thread(new ThreadTask1());
// 작업 스레드 실행, run() 내부 코드 처리
thread1.start();
}
}
// Runnable 인터페이스 구현 클래스
class ThreadTask1 implements Runnalbe {
public void run() {
for (int i=0; i<100; i++) {
System.out.print("#");
}
}
}
(2) Thread 클래스를 상속받은 하위 클래스에서 run()을 구현
public class ThreadExample2 {
public static void main(String[] args) {
// Thread 클래스를 상속받은 클래스 인스턴스화, 스레드 생성
ThreadTask2 thread2 = new ThreadTask2();
// 작업 스레드 실행, run() 내부 코드 처리
thread2.start();
}
}
// (1)의 코드와 다른 점은 Thread 클래스를 직접 인스턴스화하지 않는다는 점이다.
class ThreadTask2 extedns Thread {
public void run() {
for (int i=0; i < 10; i++) {
System.out.print("*");
}
}
(3) 익명 구현/하위객체를 활용한 스레드 생성 및 실행
public class ThreadExample3 {
public static void main(String[] args) {
// 익명 Runnable 구현 객체를 활용, 스레드 생성
Thread thread1 = new Thread(new Runnable() {
public void run() {
for (int i=0; i<10; i++) {
System.out.print("*");
}
}
});
thread1.start();
// 익명 Thread 하위 객체를 활용, 스레드 생성
Thread thread2 = new Thread() {
public void run() {
for (int i=0; i<10; i++) {
System.out.print("^");
}
}
};
thread2.start();
}
}
- 스레드의 이름
▪ 메인스레드의 이름은 "main"이다.
▪ 그 외 추가 생성된 스레드는 기본적으로 "Thread-n" 이름을 가진다.
▪ 스레드의 이름을 조회하는 방법
public class ThreadName {
public static void main(String[] args) {
Thread thread1 = new Thread(new Runnable() {
public void run() {
System.out.println("My Thread Name");
}
});
thread1.start();
System.out.println(thread1.getName());
}
}
// 출력값
My Thread Name
Thread-0
▪ 스레드의 이름을 설정하는 방법
public class ThreadName {
public static void main(String[] args) {
Thread thread1 = new Thread(new Runnable() {
public void run() {
System.out.println("Set My Thread Name");
}
});
thread1.start();
System.out.println(thread1.getName());
thread1.setName("My Lime Thread");
System.out.println(thread1.getName());
}
}
// 출력값
Set My Thread Name
Thread-0
My Lime Thread
▪ 스레드 인스턴스의 주소값을 얻는 방법
-> 실행 중인 스레드의 주소값을 사용해야 하는 경우 Thread 클래스의 정적 메서드 currentThread()를 사용한다.
public class ThreadName {
public static void main(String[] args) {
Thread thread1 = new Thread(new Runnable() {
public void run() {
System.out.println(Thread.currentThread().getName());
}
});
thread1.start();
System.out.println(Thread.currentThread().getName());
}
}
// 출력값
Thread-0