자바 스레드
- 스레드(thread)
- 운영체제에 의해 관리되는 하나의 작업 혹은 태스크
- 스레드와 태스크(혹은 작업)은 바꾸어 사용해도 무관
- 멀티스레딩(multi-threading)
- 여러 스레드를 동시에 실행시키는 응용프로그램을 작성하는 기법
- 스레드 만드는 2 가지 방법
- java.lang.Thread 클래스를 상속받아 스레드 작성
- java.lang.Runnable 인터페이스를 구현하여 스레드 작성
- 스레드 종료
- 스스로 종료
- run() 메소드 리턴
- 타 스레드에서 강제 종료
- interrupt() 메소드 사용
- 스스로 종료
- Thread와 Runnable 사용 스레드 사용 예
123456789101112131415161718192021222324252627282930313233343536373839404142434445package kr.co.moak;class MyThread extends Thread{public void run(){for(int i=0; i<10; i++){try {sleep(100);System.out.print(",t" + i);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}}public class N01_WhanThread implements Runnable{@Overridepublic void run() {// TODO Auto-generated method stubfor(int i=0; i<10; i++){try {Thread.sleep(100);System.out.print(",r" + i);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}public static void main(String[] args) {// TODO Auto-generated method stubN01_WhanThread w = new N01_WhanThread();Thread th1 = new Thread(w);Thread th2 = new Thread(w);MyThread th3 = new MyThread();MyThread th4 = new MyThread();th1.start();//th2.start();th3.start();//th4.start();}}
- 스레드 동기화(Thread Synchronization)
- 다수의 스레드가 공유 데이터에 동시에 접근하는 경우
- 공유 데이터의 값에 예상치 못한 결과 발생 가능
- 스레드 동기화
- 스레드 사이의 실행순서 제어, 공유데이터에 대한 접근을 원활하게 하는 기법
- 멀티스레드의 공유 데이터의 동시 접근 문제 해결
- 방법1) 공유 데이터를 접근하는 모든 스레드의 한 줄 세우기
- 방법2) 한 스레드가 공유 데이터에 대한 작업을 끝낼 때까지 다른 스레드가 대기 하도록 함
- 자바의 스레드 동기화 방법 – 2가지
- synchronized 키워드로 동기화 블록 지정
- wait()-notify() 메소드로 스레드의 실행 순서 제어
- 다수의 스레드가 공유 데이터에 동시에 접근하는 경우
- Synchronized 사용 예
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556public class SynchronizedEx {public static void main(String[] args) {SharedPrinter p = new SharedPrinter(); // 공유 데이터 생성String [] engText = { "Wise men say, ","only fools rush in","But I can't help, ","falling in love with you","Shall I stay? ","Would it be a sin?","If I can't help, ","falling in love with you" };String [] korText = { "동해물과 백두산이 마르고 닳도록, ","하느님이 보우하사 우리 나라 만세","무궁화 삼천리 화려강산, ","대한 사람 대한으로 길이 보전하세","남산 위에 저 소나무, 철갑을 두른 듯","바람서리 불변함은 우리 기상일세.","무궁화 삼천리 화려강산, ","대한 사람 대한으로 길이 보전하세" };Thread th1 = new WorkerThread(p, engText);//영문출력스레드Thread th2 = new WorkerThread(p, korText);//국문출력스레드// 두 스레드를 실행시킨다.th1.start();th2.start();}}// 두 WorkerThread 스레드에 의해 동시 접근되는 공유 프린터class SharedPrinter {// synchronized를 생략하면// 한글과 영어가 한 줄에 섞여 출력되는 경우가 발생한다.//synchronized void print(String text) {void print(String text) {// Thread.yield();for(int i=0; i<text.length(); i++){System.out.print(text.charAt(i));}System.out.println();}}// 스레드 클래스class WorkerThread extends Thread {SharedPrinter p; // 공유 프린터 주소String [] text;WorkerThread(SharedPrinter p, String[] text) {this.p = p; this.text = text;}// 스레드는 반복적으로 공유 프린터에 10번 접근 text[] 출력public void run() {for (int i=0; i<text.length; i++) // 한 줄씩 출력p.print(text[i]); // 공유 프린터에 출력}}