가자미의 개발이야기
[자바] 쓰레드 생성과 실행 본문
현재 실행 중인 프로그램을 프로세스라고 부른다.
이 프로세스가 어떤 실행의 흐름을 만드는 최소의 단위를 쓰레드라고 한다.
(프로세스는 공장이고 쓰레드는 일꾼이라고 생각하면 된다.)
ex. 메인 메소드.
메인 쓰레드는 자동으로 생성되지만 다른 쓰레드는 프로그래머가 직접 생성해야 한다.
멀티쓰레딩의 장점
- CPU의 사용률을 향상
- 자원을 보다 효율적으로 사용가능
- 사용자에 대한 응답성 향상
- 작업이 분리되어 코드가 간결
a. 쓰레드의 구현과 실행
- Thread클래스를 상속
class MyThread extends Thread { public void run(){ /*작업내용*/} //Thread 클래스의 run()을 오버라이딩 } MyThread t1 = new MyThread(); //인스턴스 생성
- Runnable인터페이스를 구현
class MyThread implements Runnable { public void run() { /*작업내용*/ } //Runnable 인터페이스의 run()을 구현 } //인스턴스 생성 Runnable r = new MyThread(); Thread t2 = new Thread(r); Thread t3 = new Thread(new MyThread());
- 람다를 활용해 쓰레드 생성
Runnable 인터페이스 구현한 인스턴스 생성 - Thread 인스턴스 생성 - start메소드 실행public static void main(String[] args) { Runnable task = ()->{//쓰레드가 실행하게 할 내용 int n1=10; int n2=20; String name=Thread.currentThread().getName(); System.out.println(name+":"+(n1+n2)); }; Thread t = new Thread(task); t.start();//쓰레드 생성 및 실행 System.out.println("End"+Thread.currentThread().getName()); }
b. start()
쓰레드를 생성해도 start해야 쓰레드가 실행됨.
start해도 바로 실행되지 않음. 대기하다 자기 차례가 되어야 실행.
start는 반드시 한번만 호출되어야 한다.
다시 쓰레드를 사용하려면 새로운 쓰레드를 생성해 써야 한다.
MyThread t1 = new Thread();
t1.start();
t1.start(); //예외 발생
MyThread t2 = new Thread();
t2.start();
MyThread t3 = new Thread();
t3.start();
start()와 run()의 차이점.
start는 메인 쓰레드에서 실행되고 나서, 새로운 쓰레드를 생성하고 호출 스택을 만들어 run()을 실행한다.
반면 run은 새로운 호출 스택 생성 없이 그냥 main에서 바로 run()을 실행한다.
싱글쓰레드 vs 멀티쓰레드
멀티 쓰레드가 무조건 좋은 건 줄 알았지만, 막상 싱글 쓰레드와 비슷한 시간이 걸리거나,
쓰레드간의 작업 전환 시간 때문에 멀티 쓰레드가 시간 더 걸리기도 한다.
따라서 싱글코어를 활용한 단순 계산 작업이면, 싱글 쓰레드를 사용하는 게 낫다.
반면 두 쓰레드가 서로 다른 자원을 사용하는 작업은 멀티 쓰레드가 낫다.
(데이터 입력/네트워크 파일 송수신/파일출력 외부기기와 입출력 해야할 경우 등)
//싱글쓰레드로 작업
class Single{
public static void main(String args[]){
long startTime = System.currentTimeMillis();
for(int i=0;i<300;i++)
System.out.printf("%s", new String("-"));
System.out.print("소요시간1:"+(System.currentTimeMillis()-startTime));
for(int i=0;i<300;i++)
System.out.printf("%s", new String("|"));
System.out.print("소요시간2:"+(System.currentTimeMillis()-startTime));
}
}
//멀티쓰레드로 작업
class Multi{
static long startTime=0;
public static void main(String args[]){
ThreadEx3_1 th1 = new ThreadEx3_1();
th1.start();
startTime=System.currentTimeMillis();
for(int i=0;i<300;i++)
System.out.printf("%s", new String("-"));
System.out.print("소요시간1:"+(System.currentTImeMillis()-Multi.startTime());
}
}
class ThreadEx{
public void run(){
for(int i=0;i<300;i++)
System.out.printf("%s", new String("|"));
System.out.print("소요시간2:" + (System.currentTimeMillis()-Multi.startTime));
}
}
'Java > 자바 기본 문법' 카테고리의 다른 글
[자바] 쓰레드를 생성하는 더 좋은 방법 (0) | 2021.03.02 |
---|---|
[자바] 쓰레드의 동시접근 문제와 동기화 (0) | 2021.03.02 |
[자바] NIO 기반 입출력 (0) | 2021.03.01 |
[자바] NIO 기반 바이트 스트림 & 문자 스트림 생성 (0) | 2021.03.01 |
[자바] 파일 시스템 (0) | 2021.03.01 |