Java Basic: thread
멀티 프로세스
하나의 컴퓨터에서 한꺼번에(동시에) 여러 프로그램을 동시에 실행시킬 수 있는 것
멀티 쓰레드
하나의 프로그램에서 동시에 여러개의 메소드를 동작시키는 것
멀티 쓰레드
하나의 프로그램에서 동시에 여러개의 메소드를 동작시키는 것을 말함
가능하면 두개의 객체가 동시에(공평하게) 동작하게끔하기위해
멀티쓰레드 프로그래밍을 구현한다.
자바에서는 멀티쓰레드 프로그래밍을 위해
Thread 클래스와 , Runnable 인터페이스를 제공.
Thread 클래스를 이용한 “멀티쓰레드 프로그래밍”
1) Thread클래스를 상속받아 클래스를 만든다.
2) run메소드를 오버라이딩하여 동시에 실행시킬 명령어를 써준다.
3) 객체를 생성한 다음 start()를 호출한다.
class MyThread extends Thread{
public void run(){
동시에(공평하게) 실행시키고자 하는 명령어(들)
}
}
MyThread t = new MyThread();
t.start();
쓰레드를 가동(동시에 공평하게 실행해보자) 시키려면 start()메소드 호출해야한다.
- 주의!
start를 호출하지 않고 run()을 직접 호출하면 쓰레드가 가동(공평하게 실행) 되지 않고 일반 메소드처럼 동작하여 호출한 순서대로 쭉 실행된다!
Runnable 인터페이스를 구현한 “멀티쓰레드 프로그래밍”
1) Runnable 인터페이스를 구현한 클래스를 만든다.
2) run 메소드를 오버라이딩한다.
3) 해당 클래스 객체를 Thread 클래스로 포장하여 start()를 호출한다.
- e.printStackTrace();
누가 근본적으로 예외를 발생시키는가
추적하기 위하여 사용하는 메소드
Thread의 우선순위
-
setPriority() 매개변수로 1~10까지의 정수를 전달한다. 숫자가 높을수록 우선순위가 높다.
-
상수로 선언되어있는 우선순위 3가지
Thread.MAX_PRIORITY : 우선순위 최고값 10을 의미
Thread.NORM_PRIORITY :중간값 5를 의미(우선순위 미지정시 기본값 5)
Thread.MIN_PRIORITY : 최저값 1을 의미우선순위를 높게 설정하는 것은
가급적이면 일을 빨리 끝내달라고 요청하는 것이지
반드시 그 스레드가 일을 빨리 끝내는 것이 보장되지는 않는다.
join 메소드
쓰레드가 종료 될때까지 대기시키기 위한 메소드
쓰레드를 가동시키면 그떄부터는 명령어가 순서대로 동작하지 않고 가급적이면 공평하게 실행이 되게끔 스케줄링 해준다. 만약에 어떠한 명령어(들)가 쓰레드가 완전히 종료한 다음 실행해야할 때에는 join메소드를 호출하여 쓰레드가 모두 종료될떄까지 대기하도록 한다.
임계영역(Critical Section)
한번에 하나의 쓰레드에게만 접근을 허용하는 영역(멤버변수)를 말한다.
synchronized 사용
한번에 하나의 쓰레드에게만 접근을 허용해야하는 메소드의 왼쪽에
synchronized라고 써주면 자바가 알아서 임계영역 처리를 해준다.
하나의 쓰레드만 접근하도록 lock을 걸어주고 일이 끝나면 lock을 풀어준다.
쓰레드사이의 통신
쓰레드를 가동시키면 가급적으로 서로 공평하게 실행이 되게끔 “스케줄링”을 해준다. 늘(언제나) 공평하게 실행이 되지는 않는다. 어떤 특정 스레드가 연달아 동작하기도 한다.
자바의 모든 클래스들은 Object의 후손이다. Object클래스에는 쓰레드사이의 통신을 위한 wait메소드와 notify메소드가 있다.
wait 메소드
쓰레드 자신을 “대기상태”로 두는 메소드
notify 메소드
“대기중인 다른 스레드”를 깨워주는 메소드
다른 쓰레드가 일이 끝날때까지 나는 대기상태(wait)에 있도록 하고 내가 일이 끝나면 notify()를 호출하여 쓰레드 사이의 통신을 할 수 있다.
프로그램 실행결과를 화면에 출력하면 "휘발성"
컴퓨터를 끄면 혹은 창을 닫으면
출력한 결과가 날아간다
화면에 출력하는 대신 파일로 출력할 수 있다.
자바에서는 입력 및 출력을 위하여 스트림을 제공한다 순서있는 자료의 흐름을 스트림이라고 한다. 자바에서는 스트림(입출력)을 위한 클래스들을 java.io 패키지에 모아두었다.
입출력(스트림)
입출력(스트림)을 위한 최상위 클래스는 크게 두가지가 있다.
-
문자단위의 입출력 생성된 파일은 메모장같은 편집기에 바로 내용을 확인할 수 있다. 이것은 확장자를 일반적으로 .txt로 만든다.
-
바이트단위의 입출력 그림이나 소리파일이나 동영상처럼 메모장에서 바로 확인x 특정 프로그램에서 내용을 확인해야 하는 파일들 이러한 파일은 바이트단위의 입출력으로 처리해야한다.
문자단위의 입출력을 위한 클래스
- Reader
- Writer
바이트단위의 입출력을 위한 클래스
- InputStream
- OutputStream