21.11.26(금)
- 컴퓨터가 어떤 일을 하고 있는 상태
ex) 문서를 실행시키는 작업, 프로그램을 실행시키는 작업
- 동시적, 병렬적 또는 둘의 혼합으로 진행된다.
- 동시성은 프로세스 1개가 여러개의 작업을 조금씩 조금씩 번갈아가면서 하는것.
(번갈아하는게 빨라서 동시로 진행되는것처럼 보임)
- 병렬성은 프로세스 1개에 다중 코어를 갖고 있어 각각의 작업을 동시에 진행하는 것.
- 프로세스는 컴퓨터의 자원(메모리,cpu)을 분할해서 쓴다.
- 한 프로세스 내에서도 여러 갈래의 작업들이 동시에 진행되어야 함 이 갈래를 쓰레드라고 부른다.
ex) 한 식당에서 한 요리사가 스테이크, 파스타, 햄버거 3개의 메뉴를 내놓는다고 할때 스테이크,
파스타, 햄버거는 각각 1개의 프로세스들로 볼 수 있고 햄버거 조리대 안에서
1.패티 굽기 2.빵에 상추올리기 3.소스 뿌리기 등을 각각 1개의 스레드로 볼 수 있다.
- 쓰레드는 프로세스에 할당된 자원을 분할해서 쓴다.
- 프로세스안의 공유되는 1개 변수에 서로 다른 2개의 쓰레드가 접근하면 에러가 된다.
ex) 버튼 1개를 1번 누를때 +1이 되는 프로세스를 쓰레드 2개가 접근하여 10번 누른다고 하면
+20이 되는게 아니라 20보다 작은 수가됨(중복)
- 쓰레드 갯수에 따라 싱글 쓰레드 프로세스, 멀티 쓰레드 프로세스로 나뉜다.
- 시스템 자원을 보다 효율적으로 사용할 수 있다.
- 사용자에 대한 응답성이 향상된다.
- 작업이 분리되어 코드가 간결해진다.
- 변수를 공유하기 때문에 동기화에 주의해야한다.
- 교착상태가 발생하지 않도록 주의해야한다.
- 특정 쓰레드가 작업할 기회를 놓치는 기아 현상이 발생할 수도 있다.
(각 쓰레드가 효율적으로 고르게 실행될 수 있도록 해야 한다.)
1) Thread 클래스를 구현
class MyThread extends Thread {
public void run(){ //Thread 클래스의 run()을 오버라이딩
//작업내용
}
}
MyTread t1 = new MyTread(); //쓰레드의 생성
t1.start(); //쓰레드의 실행
2) Runnable 인터페이스를 구현(다른 클래스를 상속 받고 싶을때)
class MyThread2 extends (...) implements Runnable {
public void run(){ //Runnable 인터페이스의 추상 메소드 run()을 구현
//작업내용
}
}
Runnable r = new MyThread2();
Thread r2 = new Thread(r); // Thread(Runnable r)
=> Thread t2 = new Thread(new MyThread2());
t2.start();