1 Thread(쓰레드) 생성
쓰레드는 기본적으로 1개의 쓰레드를 갖고 있다. 따라서 순차적 구조로 위에서 시작해 아래로 코드를 실행시킨다. 여기서 쓰레드를 새로 생성시키게 되면 2개 이상의 코드를 동시에 실행시킬 수 있다.
쓰레드의 생성방법 2
1. implements Runnable 한 클래스를 정의.
2. run() 메서드를 오버라이드.
3. Runnable 객체 생성
4. Thread 객체 생성하고 생성자 호출시 Runnalble 객체의
참조값을 생성자 파라미터에 담아줌.
5. Thread 객체.start() 호출.
쓰레드를 생성하는 방법이 두가지인 이유는 자바가 다중상속이 불가하기 때문이다.
따라서 어떤 클래스를 상속받는 클래스에 쓰레드를 적용해야 할 경우 위의 방법으로 쓰레드를 생성한다.
Ex
다음은 쓰레드로 1초에 한번씩 카운트해서 , 1 ~ 5까지 출력하는 예제이다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
package Thread;
class ThreadCount implements Runnable {
public void run(){
for (int i = 1; i <= 5; i++) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.print(i);
}
}
}
public class Implements_Runnable {
// 쓰레드로 1초에 한번씩 카운트, 1 ~ 5 출력.
public static void main(String[] args) {
ThreadCount count = new ThreadCount(); // Runnable 구현클래스 객체화
// ↓ Thread객체를 생성하고 Runnable객체의 참조값을 Thread생성자에 담아줌.
Thread th = new Thread(count);
th.start(); // Runnable 내의 구문이 실행되게 됨.
}
}
|
cs |
Runnable 를 implements 하는 클래스 ThreadCount 를 생성하고 내부에 for문을 이용해 1부터 5까지 출력되도록 작성하였다. 1초에 한번씩 작성되게하기 위하여 sleep()을 사용했는데 해당 메서드는 Thread 클래스 내부에 있는 것이므로 Thread.sleep() 으로 작성해주어야 한다.
기존의 Thread 클래스를 상속받아 만든 쓰레드와는 다르게 Runnable 을 implements 하여 만든 쓰레드는 작동을 위해 줄18~21과 같이 Runnable 객체를 생성하고, Thread 객체를 또 생성하여 생성자의 매개변수로 Runnable 의 참조변수값을 넣어준다.
그리고 나서 Thread객체의 start() 메서드를 호출하면 Runnable 쓰레드가 실행된다.
Ex
저번 포스팅에서 방법1.로 만들어준 "HELLO" , "hello" 를 1초에 한번씩 출력하는 프로그램을 방법2. 로 만들었다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
|
package Thread;
class RunHello1 implements Runnable{
public void run(){
for (int i = 0; i < 5; i++) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("HELLO");
}
}
}
class RunHello2 implements Runnable{
public void run(){
for (int i = 0; i < 5; i++) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("hello");
}
}
}
public class Runnable_HELLOhello {
public static void main(String[] args) {
RunHello1 r1 = new RunHello1();
RunHello2 r2 = new RunHello2();
Thread th1 = new Thread(r1);
Thread th2 = new Thread(r2);
th1.start();
th2.start();
}
}
|
cs |
2 쓰레드 우선순위
다음과 같이 setPriority() 메서드를 사용해 쓰레드의 우선순위를 설정해줄 수 있다. 값이 높을수록 먼저 처리된다.
thread.setPriority(1~10);
thread.setPriority(Thread.MIN_PRIORITY); // 1
thread.setPriority(Thread.NORM_PRIORITY); // 5
thread.setPriority(Thread.MAX_PRIORITY); // 10
Ex
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
|
package Thread;
class ThreadPri extends Thread {
String name;
int priority;
ThreadPri(String name, int priority){
this.name = name;
this.priority = priority;
setPriority(priority); // 쓰레드 우선순위 setting
}
public void run() {
for (int i = 0; i < 10; i++) {
try {
sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(name+" : "+getPriority()); // 또는 priority
}
}
}
public class Thread_Priority {
public static void main(String[] args) {
ThreadPri th1 = new ThreadPri("첫번째", 9);
ThreadPri th2 = new ThreadPri("두번째", Thread.MAX_PRIORITY); // 또는 10
ThreadPri th3 = new ThreadPri("세번째", Thread.NORM_PRIORITY); // 또는 5
ThreadPri th4 = new ThreadPri("네번째", Thread.MIN_PRIORITY); // 또는 1
th1.start();
th2.start();
th3.start();
th4.start();
}
}
|
cs |
객체 생성과 동시에 몇번째 객체인지 나타내는 String 값과 Thread_Priority 값을 매개변수로 입력받아 줄6의 생성자를 통해 값을 전달 받고 줄8,9를 통해 줄4,5 의 변수값에 전달한다. 그리고 줄10에서 setPriority() 로 매개변수로 입력받은 priority 를 우선순위 값으로 설정한다.
결과를 보면 알 수 있다시피 쓰레드의 우선순위는 다음과 같다.
1. th2 = MAX_PRIORITY ( ==10 )
2. th1 = 9
3. th3 = NORM_PRIORITY ( ==5 )
4. th4 = MIN_PRIORITY ( ==1 )
쓰레드의 우선순위가 높은 경우 작업을 할 수 있는 시간이 더 많이 주어진다.
'Java > Java 기초문법' 카테고리의 다른 글
[JAVA 기초] 쓰레드(Thread) 4 - 쓰레드의 상태 싸이클과 제어 메서드 (0) | 2021.04.13 |
---|---|
[JAVA 기초] 쓰레드(Thread) 3 - 동기화(Synchronized)와 데몬쓰레드(Daemon Thread) (0) | 2021.04.13 |
[JAVA 기초] 쓰레드(Thread) 1 - 쓰레드 생성방법1 (0) | 2021.04.12 |
[JAVA 기초] 자바 예외처리 3 - 사용자 정의 예외(user-defined exception) 와 예외처리 연습문제 (0) | 2021.04.12 |
[JAVA 기초] 자바 예외처리 2 - 예외의 종류(Checked, Unchecked)와 예외 발생(throws, throw) (0) | 2021.04.11 |
댓글