반응형
어제 공부했던 내용을 전부 올리려고 했었는데 너무 피곤해서 당일에 올리지 못해서 오늘 아침에 올립니다.
자바의 쓰레드 사용법과 간단한 예시로 공부하였습니다.
아직까지 쓰레드에 대하여 깊게 공부하지는 못해서 간단한 예시를 만들어 이해해보았습니다.
먼저 Thread(쓰레드)란 |
프로그램 내에서 실행의 흐름을 이루는 최소의 단위이며, 하나의 프로세스 내부에서 실제로 실행되는 하나의 작업 단위를 말하며, 세부적으로는 운영체제에 의해 관리되는 하나의 작업 혹은 task를 의미합니다. 모든 프로세스에는 한 개 이상의 쓰레드가 존재하여 작업을 수행합니다. 쓰레드와 태스크(task 또는 작업)은 바꾸어 사용해도 됩니다. 그리고 main 메서드의 실행도 하나의 쓰레드에 의해 진행이 됩니다. 또한, 쓰레드가 존재하며 두 개 이상의 쓰레드를 가지는 프로세스를 멀티쓰레드 프로세스(multi-threaded process)라고 합니다. |
▶ 멀티쓰레딩의 장점
- CPU의 사용률을 향상시킵니다.
- 자원을 보다 효율적으로 사용 할 수 있습니다.
- 사용자에 대한 응답성이 향상됩니다.
- 작업이 분리되므로 코드가 간결해집니다.
▶ 멀티쓰레딩의 단점
- 여러 쓰레드가 같은 프로세스 내에서 자원을 공유하며 작업을 하기 때문에 동기화(Synchronization), 교착상태(Deadlock)와 같은 문제가 생길 수 있습니다.(따라서 신중하게 프로그래밍 해야 합니다.)
- 그렇기 때문에 쓰레드 환경에서도 잘 작동 하는 Thread safe가 되어야 합니다.
▶ 쓰레드의 생성과 실행
◎ 자바에서 쓰레드를 생성하는 방법은 3가지가 있습니다.
1. Thread 클래스를 extends(상속)받는 방법
2. Runnable 인터페이스를 implements(구현)하는 방법
3. 익명클래스를 이용하는 방법
세 방법 모두 쓰레드를 통하여 작업하고 싶은 내용을 run() 메서드에 작성하면 됩니다.
▶ 아래는 세 가지 방법의 코드 예시입니다.
1. Thread 클래스를 extends(상속)받는 방법입니다. 다른 클래스를 상속하지 않을 경우에 사용합니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
package Tt;
public class Threadtest2 extends Thread {
public void run() {
try {
System.out.println("1번 방법 Thread test");
} catch (Exception e) {
System.out.println(e.getMessage());
}
}
}
|
cs |
1
2
3
4
5
6
7
8
9
10
11
12
|
package Tt;
public class Threadtestmain {
public static void main(String[] args) {
// TODO Auto-generated method stub
Threadtest2 test=new Threadtest2();
test.start();
}
}
|
cs |
2. Runnable 인터페이스를 implements(구현)하는 방법입니다.
- 다른 클래스를 extends(상속)하여 Thread 클래스를 상속하지 못하는 경우에는 Runnable을 구현하여 쓰레드를 생성하면 됩니다 그 이유는 extends는 하나의 클래스에 한개만 가능하기 때문입니다.
- 또한 인터페이스를 구현시켜 여러개의 상속이 가능하다는 장점이 있습니다.
- 하지만 구현부가 없어서 아무런 기능도 하지않고 내부 함수들을 모두 오버라이딩 해야 합니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
package Tt;
public class Threadtest2 implements Runnable {
@Override
public void run() {
try {
System.out.println("2번 방법 Thread test");
} catch (Exception e) {
System.out.println(e.getMessage());
}
}
}
|
cs |
1
2
3
4
5
6
7
8
9
10
11
12
13
|
package Tt;
public class Threadtestmain {
public static void main(String[] args) {
// TODO Auto-generated method stub
Threadtest2 test=new Threadtest2();
Thread test2= new Thread(test);
test2.start();
}
}
|
cs |
3. 익명클래스를 이용하는 방법입니다.
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
|
package Tt;
public class Threadtest3 {
public static void main(String[] args) {
// TODO Auto-generated method stub
new Thread() {
int i=0;
public void run() {
while (i!=1) {
try {
for (int i = 0; i < 5; i++) {
Thread.sleep(1000);
System.out.println("3번 Thread test");
}
i++;
} catch (Exception e) {
System.out.println(e.getMessage());
}
}
}
}.start();
}
}
|
cs |
1번과 2번의 결과는 간단하여 생략하였습니다.
▶ 아래는 3번의 실행결과입니다.
반응형
최근댓글