애플리케이션
이 실행되면 운영체제
로부터 실행에 필요한 메모리
를 할당받는다초창기 시스템. 한번에 하나의 프로그램만 실행됨
다른 프로그램을 실행하려면 실행하던 프로그램을 종료 후 그 다음 프로그램을 실행해야
CPU사용률
이 좋지 않음. IO작업을 하면 CPU는 놀고 있음. 프로세스가 IO작업을 하는 동안에는 CPU는 놀고 있음여러개의 프로그램이 동시에 실행되는 것
여러 개의 프로그램을 메모리에 올려놓고 동시에 실행.
ex) IO작업이 발생하면 다른 프로세스가 CPU에서 실행됨. CPU를 사용하던 프로세스가 IO작업을 해야 하는 상황이 오면 다른 프로세스가 CPU에서 실행됨.
CPU사용률을 극대화
시키는 것다른 프로세스는 계속 대기
프로세스가 CPU를 사용할 때 아주 짧은 시간(=quantum)만 CPU에서 실행되도록 하는 것
동시에 여러 프로그램을 실행시
킨다는 면에서는 멀티프로그래밍과 유사.
거기에, CPU time을 아주 짧은 time slice로 쪼개서
그 시간안에서 여러 프로세스들이 서로 번갈아가면서 실행되도록 하는 것
하나의 프로세스가 동시에 여러 작업을 실행
멀티태스킹이의 개념이 확장된 것
여러 프로세스와 여러 스레드가 아주 짧게 쪼개진 CPU타임을 나눠 가짐
두 개 이상의 프로세서나 코어를 활용하는 시스템
멀티태스킹 : 코어별로 병합하는게 있어야. CPU시간을 잘게 쪼개서 그 시간안에서 프로세스(or스레드)들이 번갈아 실행
자바의 모든 애플리케이션은 메인 스레드가 main()메소드를 실행하면서 시작된다
메인 스레드는 main()메소드의 첫 코드부터 아래로 순차적으로 실행한다
main() 메소드의 마지막 코드를 실행하거나 return문을 만나면 실행이 종료된다
메인 메소드는 필요에 따라 작업 스레드들을 만들어서 병렬로 실행할 수 있다
즉, 멀티 스레드를 생성해서 멀티 태스킹을 수행한다.
멀티 스레드 애플리케이션에서는 실행 중인 스레드가 하나라도 있으면, 프로세스는 종료되지 않는다
메인 스레드가 작업 스레드보다 먼저 종료되더라도 작업 스레드가 실행 중이라면 프로세스는 종료되지 않는다
멀티 스레드로 실행하는 어플리케이션을 개발하려면
Runnable을 매개값으로 갖는 생성자 호출
Thread thread = new Thread(Runnable task)
class Task implements Runnable{
public void run() {
스레드가 실행할 코드;
}
}
Runnable task = new Task(); //Runnable 구현객체 생성
Thread thread = new Thread(task); //스레드 생성
Thread thread = new Thread(new Runnable() {
public void run() {
스레드가 실행할 코드;
}
});
작업 스레드가 실행할 작업을 Runnable로 만들지 않고, Thread의 하위 클래스로 작업 스레드를 정의하면서 작업내용을 포함시킬 수 있다.
public class WorkerThread extends Thread { //스레드 하위 클래스 선언
@Override
public void run() {
//스레드가 실행할 코드;
}
}
Thread thread = new WorkerThread(); //스레드 생성
Thread thread = new Thread() {
public void run() {
//스레드가 실행할 코드;
}
}
디버깅 시 어떤 스레드가 어떤 작업을 하는지 조사할 목적으로 사용됨
참고
https://www.youtube.com/watch?v=QmtYKZC0lMU&list=PLcXyemr8ZeoRRaTfapB8GMMrLMlCTN4wJ&index=7