Step 1) Runnable 인터페이스 타입의 매개값을 갖는 생성자 호출
Thread thread = new Thread(Runnable target);
public class Task implements Runnable {
public void run() {
// 스레드가 실행할 코드
}
}
public class MultiThread {
Runnable task = new Task();
// 구현 객체를 매개값으로 해서 Thread 생성자를 호출 -> 작업 스레드 생성
Thread thread = new Thread(task);
}
public class RunnableAnony {
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
// 스레드가 실행할 코드
}
});
}
Step 2) start() 메소드 호출
// 매개값으로 받은 Runnable의 run()메소드 실행
thread.start();
예제) 0.5초 간격으로 비프음을 발생시키면서 동시에 프린팅하는 작업
// 작업을 정의하는 Runnable 구현 클래스
public class BeepTask implements Runnable {
@Override
public void run() {
// 스레드 실행 내용
Toolkit toolkit = Toolkit.getDefaultToolkit();
for (int i=0; i<5; i++) {
toolkit.beep();
try {
Thread.sleep(500);
} catch (Exception e) {}
}
}
}
// 메인 스레드와 작업 스레드를 동시에 실행 1
public class BeepPrintExample1 {
public static void main(String[] args) {
// BeepTask 클래스 이용해서 Runnable 구현 객체를 생성
Runnable beepTask = new BeepTask();
// Thread 생성자 호출시 BeepTask 객체를 매개값으로 이용, 작업 스레드 생성
Thread thread = new Thread(beepTask);
// 작업 스레드에 의해 BeepTask 객체의 run() 메소드 실행되어 비프음이 발생
thread.start();
// 메인 스레드가 for 문을 실행해서 0.5초 간격으로 "띵!"을 프린트
for(int i=0; i<5; i++) {
System.out.println("띵!");
try {
Thread.sleep(500);
} catch (Exception e) {}
}
}
}
// 메인 스레드와 작업 스레드를 동시에 실행 2
public class BeepPrintExample2 {
public static void main(String[] args) {
// 위와의 차이점 : BeepTask 라는 클래스를 따로 만든 뒤 이를 이용해서 구현 객체를 만드는게 아님 !
// 익명 구현 객체를 이용해서 바로 생성한다.
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
// 작업 스레드의 실행내용을 여기에 쓰는거 !
Toolkit toolkit = Toolkit.getDefaultToolkit();
for (int i=0; i<5; i++) {
toolkit.beep();
try {
Thread.sleep(500);
} catch (Exception e) {}
}
} // run ()
});
}
}
public class WorkerThread extends Thread{
@Override
public void run() {
// 스레드가 실행할 코드
}
}
Thread thread = new WorkerThread();
// 방법 1과 같이 익명 구현 객체를 통해 코드를 절약할 수도 있음
Thread thread = new Thread(){
public void run(){
// 스레드가 실행할 코드.
}
}
public class BeepPrintExample3 {
public static void main(String[] args) {
Thread thread = new Thread() {
@Override
public void run() {
// 작업 스레드의 실행내용
Toolkit toolkit = Toolkit.getDefaultToolkit();
for (int i=0; i<5; i++) {
toolkit.beep();
try {
Thread.sleep(500);
} catch (Exception e) {}
}
} // run ()
};
thread.start();
for(int i=0; i<5; i++) {
System.out.println("띵!");
try {
Thread.sleep(500);
} catch (Exception e) {}
}
}
}
public void method(){
// 여러 스레드가 실행 가능한 영역
synchronized(공유객체){
// 임계 영역 (단 하나의 스레드만 실행)
}
// 여러 스레드가 실행 가능한 영역
}