본문 바로가기
Framwork/Java기초

Chapter 15. 스레드

by 김엉배 2023. 11. 13.
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
반응형