728x90
반응형
목차
1. 스레드(thread)
2. Thread 클래스를 이용하여 스레드 생성하기
3. Runnable 인터페이스를 이용하여 스레드 생성하기
4. 스레드에 이름 붙이기
5. 스레드 조절하기
6. 스레드에 우선순위 주기
1. 스레드(thread)
- 컴퓨터에서 여러 가지 일을 동시에 처리하는 것을 멀티태스킹(multi-tasking)이라고 한다.
- 멀티태스킹은 크게 프로세스 기반 멀티태스킹과 스레드 기반의 멀티태스킹이 있다.
- 프로세스 기반 멀티태스킹
- 프로그램이 여러 개 동시에 수행되면서 여러 일을 동시에 수행되면서 여러 일을 동시에 진행. - 스레드 기반 멀티태스킹
- 하나의 프로그램 내에서 여러 개의 스레드가 동시에 수행되면서 여러 일을 동시에 진행.
2. Thread 클래스를 이용하여 스레드 생성하기
- main 메소드 내에서 스레드 객체를 만들어 수행시키면서 main 메소드가 하나의 일을 처리하면서 동시에 스레드가 다른 일을 처리할 수 있도록 코드를 구현할 수 있다.
[Thread 생성자]
생성자 | 설명 |
Thread() | 스레드 객체를 생성 |
Thread(Runnable targer) | Runnable 인터페이스를 이용해 스레드 객체 생성 |
Thread(Runnable targer, String name) | Runnable 인터페이스를 이용해 이름이 있는 스레드 객체 생성 |
Thread(String name) | 이름있는 스레드 객체 생성 |
[Thread 메소드]
메소드 | 설명 |
String getName() | 스레드 이름을 반환 |
int getPriority() | 스레드의 우선순위를 반환 |
boolean isAlive() | 스레드가 아직 수행 중인지 판단함 |
void join() | 스레드가 끝나기를 기다림 |
void run() | 스레드가 Runnable run 객체로부터 생성되었다면 Runnable 객체의 run 메소드가 호출됨. |
void setName(String name) | 스레드에 이름을 붙임 |
void setPriority(int newProiority) | 스레드에 우선순위를 주는 메소드 |
static void sleep(long millis) | 현재 수행 중인 스레드를 millis 밀리세컨드 동안 중지하도록 함. |
void start() | 스레드 수행을 시작하게 함. |
class MyThread extends Thread { // Thread 클래스를 상속받아야 한다.
public void run() { // Thread 클래스의 run() 메소드를 오버라이딩한다.
....
}
}
public class ThreadTest { // MyThread 객체를 만들어서 수행할 클래스
public static void main(String[] args) {
Thread t = new MyThread(); // MyThread 객체 생성
t.start(); // t.start() 라고 해야 run() 메소드가 호출된다.
....
}
}
[예제]
package genericsTest;
class NumberThread extends Thread {
public void run() {
for(int i=1; i<=26; i++) {
System.out.println(i);
}
}
}
public class Code238 {
public static void main(String[] args) {
Thread t = new NumberThread();
t.start();
for(char ch='A'; ch<='Z'; ch++) {
System.out.println(ch);
}
}
}
_______________________________________________________
결과1
ABCDEFGHIJKLM12345678NO9101112PQRSTUVWXYZ1314151617181920212223242526
결과2
ABCDEFGHIJKLMNOPQRSTUV1234567891011121314151617181920212223242526WXYZ
결과3
ABCDEFGHIJKLMNOPQRSTUVW12345XYZ67891011121314151617181920212223242526
3. Runnable 인터페이스를 이용하여 스레드 생성하기
class MyThread implements Runnable{ // Runnable 인터페이스를 구현하는 클래스
public void run() { // Thread 클래스의 run() 메소드를 오버라이딩
....
}
}
public class RunnableTest {
public static void main(String[] args) {
Thread t = new Thread(new NumberThread()); // 스레드 객체 생성
t.start(); // 스레드 run() 메소드 수행
for(char ch='A'; ch<='Z'; ch++)
System.out.print(ch);
}
}
4. 스레드에 이름 붙이기
- 스레드를 여러 개 생성해서 동시에 수행하는 코드를 작성하려 할 때 스레드에 이름을 붙여 사용하면 편리한 경우가 있다.
Thread(String name)
THread(Runnalbe targer, String name)
[예제]
class NumberThread1 extends Thread {
String name;
NumberThread1(String name) {
this.name = name;
}
public void run() {
System.out.println(name + " starting");
try {
for(int i=0; i<10; i++) {
Thread.sleep(300);
System.out.println("In " + name + ": " + i);
}
} catch(InterruptedException e) {
System.out.println(e);
}
System.out.println(name + "terminating");
}
}
public class Code239 {
public static void main(String[] args) {
System.out.println("main starting");
Thread th = new Thread(new NumberThread1("Number Thread"));
th.start();
for(int i=0; i<10; i++) {
try {
Thread.sleep(300);
System.out.println("In main: " + i);
} catch(InterruptedException e) {
System.out.println(e);
}
}
System.out.println("main ending ");
}
}
______________________________________________________________________
결과1
main starting
Number Thread starting
In main: 0
In Number Thread: 0
In Number Thread: 1
In main: 1
In main: 2
In Number Thread: 2
In Number Thread: 3
In main: 3
In main: 4
In Number Thread: 4
In Number Thread: 5
In main: 5
In Number Thread: 6
In main: 6
In main: 7
In Number Thread: 7
In main: 8
In Number Thread: 8
In main: 9
In Number Thread: 9
main ending
Number Threadterminating
결과2
main starting
Number Thread starting
In main: 0
In Number Thread: 0
In main: 1
In Number Thread: 1
In main: 2
In Number Thread: 2
In main: 3
In Number Thread: 3
In main: 4
In Number Thread: 4
In main: 5
In Number Thread: 5
In Number Thread: 6
In main: 6
In Number Thread: 7
In main: 7
In main: 8
In Number Thread: 8
In Number Thread: 9
Number Threadterminating
In main: 9
main ending
결과3
main starting
Number Thread starting
In main: 0
In Number Thread: 0
In Number Thread: 1
In main: 1
In main: 2
In Number Thread: 2
In Number Thread: 3
In main: 3
In Number Thread: 4
In main: 4
In main: 5
In Number Thread: 5
In main: 6
In Number Thread: 6
In Number Thread: 7
In main: 7
In main: 8
In Number Thread: 8
In main: 9
In Number Thread: 9
main ending
Number Threadterminating
5. 스레드 조절하기
- main이 만든 스레드라고 하더라도 main과 똑같이 경쟁하면서 CPU를 사용하기 때문에 어느 스레드가 먼저 수행을 끝낼지 알 수 없다.
- 시스템 입장에서는 main 스레드가 자기가 만든 스레드보다 나중에 끝나는 것이 좋다. 따라서 수행시킨 스레드가 모두 끝날 때까지 기다리는 것이 필요하다.
[메소드]
메소드 | 설명 |
boolean isAlive() | 스레드가 아직 수행 중인지 판단함. |
void join() | 스레드가 끝나기를 기다림. |
[예제]
package genericsTest;
class ChildThread extends Thread {
public void run() {
for(char ch='A'; ch<='Z'; ch++) {
System.out.println(ch);
}
}
}
public class Code240 {
public static void main(String[] args) {
Thread th = new ChildThread();
th.start();
for(int i=1; i<=26; i++)
System.out.println(i);
try {
th.join();
} catch(InterruptedException ex) {
System.out.println("main thread interrupted");
}
System.out.println("main thread ending");
}
}
____________________________________________________________________
결과 1
12345678910ABCDEFGHIJKLMNOPQRSTUVW11XYZ121314151617181920212223242526main thread ending
결과 2
12ABCDEFGHIJKLMNOPQRS3TUVWXYZ4567891011121314151617181920212223242526main thread ending
결과 3
123ABCDEFGHIJKLMNOPQRSTUVWX4YZ567891011121314151617181920212223242526main thread ending
6. 스레드에 우선순위 주기
[우선순위 관련 필드]
필드 | 설명 |
static int MAX_PRIORITY | 스레드가 가질 수 있는 최대 우선순위(10) |
static int MIN_PRIORITY | 스레드가 가질 수 있는 최소 우선순위(1) |
static int NORM_PRIORITY | 스레드에게 주어지는 디폴트 우선순위(5) |
[예제]
class Priority extends Thread {
String name;
Priority(String name) {
this.name = name;
}
public void run() {
System.out.println(name + "starting");
try {
for(int i=0; i<5; i++) {
Thread.sleep(300);
System.out.println("In " + name + ": " + i + "(priority: " + getPriority() + ")");
}
} catch(InterruptedException e) {
System.out.println(name + " terminating");
}
}
}
public class Code241 {
public static void main(String[] args) {
System.out.println("main starting");
Thread th = new Thread(new Priority("Priority Thread"));
th.start();
for(int i=0; i<5; i++) {
try {
Thread.sleep(300);
System.out.println("In main: " +i);
} catch(InterruptedException e) {
System.out.println(e);
}
}
System.out.println("main ending");
}
}
________________________________________________________________________
main starting
Priority Threadstarting
In Priority Thread: 0(priority: 5)
In main: 0
In main: 1
In Priority Thread: 1(priority: 5)
In Priority Thread: 2(priority: 5)
In main: 2
In main: 3
In Priority Thread: 3(priority: 5)
In Priority Thread: 4(priority: 5)
In main: 4
main ending
728x90
반응형
'Framwork > Java기초' 카테고리의 다른 글
Chapter 16. 람다 표현식, 열거형, 어노테이션 (50) | 2023.11.14 |
---|---|
Chapter 14. 제네릭스와 컬렉션 프레임워크 (54) | 2023.11.12 |
Chapter 13. 자바 입출력 (57) | 2023.10.19 |
Chapter 12. 예외 처리 (20) | 2023.08.15 |
Chapter 11. 패키지와 클래스들 (16) | 2023.08.15 |