참고
Process 프로세스
- 운영체제에서 실행중인 하나의 프로그램
- 멀티 프로세스: 두개 이상의 프로세스가 실행되는 것
- 멀티 태스킹: 두개 이상의 프로세스를 실행하여일을 처리하는 것
Thread 스레드
개념과 특징
개념
- 프로그램의 실행흐름
- 프로세스 내에서 실행되는 세부 작업 단위
- 경량화(lightweight) 프로세스
- 하나의 프로세스 내에는 여러 개의 스레드가 존재 할 수 있다.
- 멀티스레드: 두 개 이상의 스레드
특징 (vs. Process)
프로세스에 비해 스레드는...
- 문맥교환(Context Switching) 시간이 적게 걸린다
- 스레드간의 통신시 시간이 적게 걸린다 (빠르다)
- 생성 및 종료 시간이 적게 걸린다 (빠르다)
- 동료 스레드와 사용 메모리를 공유할 수 있다.
Single Thread and Multi Thread
Single Thread
예시 - T01_ThreadTest.java
* 따로 $ 따로 200개씩 찍힘
public class T01_ThreadTest {
public static void main(String[] args) {
for (int i = 1; i < 200; i++) {
System.out.print("*");
}
System.out.println();
for (int i = 1; i < 200; i++) {
System.out.print("$");
}
}
}
Multi Thread
예시1 - T02_ThreadTest.java
1단계: Thread 클래스 생성
class MyThread1 extends Thread {
@Override
public void run() {
for (int i = 1; i <= 200; i++) {
System.out.print("쿵");
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
class MyThread2 implements Runnable {
@Override
public void run() {
for (int i = 1; i <= 200; i++) {
System.out.print("짝");
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
2단계: main()에서 실행
public class T02_ThreadTest {
public static void main(String[] args) {
MyThread1 th1 = new MyThread1();
th1.start();
MyThread2 r1 = new MyThread2();
Thread th2 = new Thread(r1);
th2.start();
Thread th3 = new Thread(new Runnable() {
@Override
public void run() {
for (int i = 1; i <= 200; i++) {
System.out.print("쿠");
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
});
th3.start();
System.out.println("★ main 메서드 퇴근 !!! ~ 안녕히계세요 여러분~ ★");
}
}
예시2 - T03_ThreadTest.java
<스레드 수행시간 체크하기>
1단계: 1~10억까지의 합계 구하는 메서드
class myRunner implements Runnable {
@Override
public void run() {
long sum = 0;
for (long i = 1L; i <= 1000000000; i++) {
sum += i;
}
System.out.println("합계 : " + sum);
}
}
2단계: 수행시간 체크
public class T03_ThreadTest {
public static void main(String[] args) {
Thread th = new Thread(new myRunner());
long startTime = System.currentTimeMillis();
th.start();
try {
th.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
long endTime = System.currentTimeMillis();
System.out.println("경과 시간 : " + (endTime - startTime) + "ms");
System.out.println("메인끝");
}
}