본문 바로가기

하../java

ch13 프로세스와 쓰레드

프로세스 : 실행 중인 프로그램, 자원(resources)과 쓰레드로 구성

쓰레드 : 프로세스 내에서 실제 작업을 수행. 모든 프로세스는 최소한 하나의 쓰레드를 가지고 있다.

프로세스 : 쓰레드 = 공장 : 일꾼

싱글쓰레드 프로세스 = 자원 + 쓰레드

멀티쓰레드 프로세스 = 자원 + 쓰레드 + 쓰레드(여러 작업을 나눠서 가능)

 

하나의 새로운 프로세스를 생성하는 거솝다 하나의 새로운 쓰레드를 생성하는 것이 더 적은 비용이 든다.

 

멀티쓰레드의 장단점

- 대부분의 프로그램이 멀티쓰레드로 작성되어 있다. 그러나 멀티 쓰레드 프로그래밍이 장점만 있는 것은 아니다.

 

장점 시스템 자원을 보다 효율적으로 사용할 수 있다.
사용자에 대한 응답성(responseness)이 향상된다
작업이 분리되어 코드가 간결해진다.
여러모로 좋음
단점 동기화(synchronization)에 주의해야 한다.
교착상태(dead-lock)가 발생하지 않도록 주의해야 한다.
각 쓰레드가 효율적으로 고르게 실행될수 있게 해야한다.

프로그래밍 할때 고려해야 할 사항들이 많다.

쓰레드의 구현과 실행

 

1.Thread클래스를 상속

class MyThread extends Thread{
 public void run(){ Thread클래스의 run()을 오버라이딩
  //작업내용
 }
}
MyThread t1 = new MyThread(); //쓰레드의 생성
t1.start(); // 쓰레드의 실행

2.Runnable인터페이스를 구현(자주 사용)

class MyThread2 implements Runnable{
 public void run() // Runnable인터페이스의 추상메서드 run()을 구현
 // 작업내용
}
Runnable r = new MyThread2;
Thread t2 = new Thread(r) //Thread (Runnable r)
//위 두줄 한줄로
Thread t2 = new Thread(new MyThread2());
t2.start();
		ThreadEx1_1 t1 = new ThreadEx1_1();

		Runnable r = new ThreadEx1_2();
		Thread t2 = new Thread(r);	  // 생성자 Thread(Runnable target)

		t1.start();
		t2.start();
	}
}

class ThreadEx1_1 extends Thread { //Thread클래스를 상속해서 쓰레드를 구현
	public void run() { //쓰레드가 수행할 작업
		for(int i=0; i < 5; i++) {
			System.out.println(getName()); // 조상인 Thread의 getName()을 호출
		}
	}
}

class ThreadEx1_2 implements Runnable { //Runnable인터페이스를 구현해서 쓰레드를 구현
	public void run() {
		for(int i=0; i < 5; i++) { //쓰레드가 수행할 작업
			// Thread.currentThread() - 현재 실행중인 Thread를 반환한다.
			System.out.println(Thread.currentThread().getName());
		}
	}
}
출력값
Thread-0
Thread-0
Thread-0
Thread-0
Thread-0
Thread-1
Thread-1
Thread-1
Thread-1
Thread-1

 

쓰레드의 실행 - start()

- 쓰레드를 생성한 후에 start()를 호출해야 쓰레드가 작업을 시작한다.

ThreadEx1_1 t1 = new ThreadEx1_1(); // 쓰레드 t1을 생성한다
ThreadEx1_1 t2 = new ThreadEx1_1(); // 쓰레드 t2를 생성한다

t1.start(); //쓰레드 t1실행
t2.start(); //쓰레드 t2실행
os스케줄러가 실행순서 결정 start했다고 바로 실행 되는것도 아니고
먼저 start했다고 먼저 되는게 아님