운영체제는 실행 중인 프로그램을 프로세스로 관리. 멀티 태스킹은 두 가지 이상의 작업을 동시에 처리하는 것. 이때 운영체제는 멀티 프로세스를 생성해서 처리.
하나의 프로세스 내에서 멀티 태스킹을 할 수 있도록 만들어진 프로그램도 있음 → 메신저는 채팅 작업을 하면서 동시에 파일 전송 작업을 수행하기도..
하나의 프로세스가 두 가지 이상의 작업을 처리할 수 있는 이유는 멀티 스레드가 있기 때문. 스레드는 코드의 실행 흐름을 말하는데, 프로세스 내에 스레드가 두 개라면 두 개의 코드 실행 흐름이 생긴다는 의미
멀티 프로세스가 프로그램 단위의 멀티 태스킹이라면 멀티 스레드는 프로그램 내부에서의 멀티 태스킹이라고 볼 수 있음.
멀티 프로세스들은 서로 독립적이므로 하나의 프로세스에서 오류가 발생해도 다른 프로세스에게 영향을 미치지 않음. 하지만 멀티 스레드는 프로세스 내부에서 생성되기 때문에 하나의 스레드가 예외를 발생시키면 프로세스가 종료되므로 다른 스레드에게 영향을 미침
예를 들어 워드와 엑셀을 동시에 사용하는 도중에 워드에 오류가 생겨 먹통이 되더라도 엑셀은 여전히 사용 가능. 하지만 멀티 스레드로 동작하는 메신저의 경우 파일을 전송하는 스레드에서 예외가 발생하면 메신저 프로세스 자체가 종료되기 때문에 채팅 스레드도 같이 종료 → 멀티 스레드를 사용할 경우에는 예외 처리가 상당히 중요
멀티 스레드는 데이터를 분할해서 병렬로 처리하는 곳에서 사용하기도 하고, 안드로이드 앱에서 네트워크 통신을 하기 위해 사용하기도 함. 또한 다수의 클라이언트 요청을 처리하는 서버를 개발할 때에도 사용. 프로그램 개발에 있어서 멀티 스레드는 꼭 필요한 기능
모든 자바 프로그램은 메인 스레드가 main()
메서드를 실행하면서 시작. 메인 스레드는 main()
메서드의 첫 코드부터 순차적으로 실행하고, main()
메서드의 마지막 코드를 실행하거나 return
문을 만나면 실행을 종료
→ 싱글 스레드에서는 메인 스레가 종료되면 프로세스도 종료. 하지만 멀티 스레드에서는 실행중인 스레드가 하나라도 있다면 프로세스는 종료 x. 메인 스레드가 작업 스레드보다 먼저 종료되더라도 작업 스레드가 계속 실행 중이라면 프로세스는 종료 x
멀티 스레드로 실행하는 프로그램을 개발하려면 먼저 몇 개의 작업을 병렬로 실행할 지 결정하고 각 작업별로 스레드를 생성해야 함.
자바 프로그램은 메인 스레드가 반드시 존재하기 때문에 메인 작업 이외에 추가적인 작업 수만큼 스레드를 생성하면 된다. 자바는 작업 스레드도 객체로 관리하므로 클래스가 필요. Thread 클래스로 직접 객체를 생성해도 되지만, 하위 클래스를 만들어 생성할 수도 있음.