스레드를 생성하는 방법
- Thread 클래스를 상속받는 방법
/* Thread 클래스를 상속 받는 방법과 run() 메서드 재정의 */
import java.lang.Thread;
class NewThread exends Thread {
public void run() {
/* Thread Body */
}
}
/* Thread 클래스를 상속받았을 경우 스레드를 start 하는 방법 */
NewThread n = new NewThread();
n.start(); /* 스레드의 시작 */
/* Thread 클래스를 상속 받는 방법과 run() 메서드 재정의 */
import java.lang.Thread;
class NewThread exends Thread {
public void run() {
/* Thread Body */
}
}
/* Thread 클래스를 상속받았을 경우 스레드를 start 하는 방법 */
NewThread n = new NewThread();
n.start(); /* 스레드의 시작 */
/* Thread 클래스를 상속 받는 방법과 run() 메서드 재정의 */ import java.lang.Thread; class NewThread exends Thread { public void run() { /* Thread Body */ } } /* Thread 클래스를 상속받았을 경우 스레드를 start 하는 방법 */ NewThread n = new NewThread(); n.start(); /* 스레드의 시작 */
- Runnable 인터페이스를 구현하는 방법
Runnable 인터페이스를 사용하는 경우는 클래스가 다른 클래스로부터 이미 상속을 받고 있을 경우에 자바는 중복 상속을 허용하지 않기 때문에 이 경우에 사용할 수 있다.
/* Runnable 인터페이스의 구현(run() 메서드 구현) */
import java.lang.Runnable;
class NewRunnableThread implements Runnable {
public void run() {
/* Thread Body */
}
}
/* Runnable 인터페이스를 이용하여 스레드를 생성하고 시작하는 방법 */
Thread t = new Thread(new NewRunnableThread());
t.start();
/* Runnable 인터페이스의 구현(run() 메서드 구현) */
import java.lang.Runnable;
class NewRunnableThread implements Runnable {
public void run() {
/* Thread Body */
}
}
/* Runnable 인터페이스를 이용하여 스레드를 생성하고 시작하는 방법 */
Thread t = new Thread(new NewRunnableThread());
t.start();
/* Runnable 인터페이스의 구현(run() 메서드 구현) */ import java.lang.Runnable; class NewRunnableThread implements Runnable { public void run() { /* Thread Body */ } } /* Runnable 인터페이스를 이용하여 스레드를 생성하고 시작하는 방법 */ Thread t = new Thread(new NewRunnableThread()); t.start();
스레드 동기화 방법
- synchronized – 시스템에 동기화를 미루는 방법
class SyncStack {
private Vector buffer = new Vector();
/* 메서드에서 사용하는 모든 공유 데이터에 하나의 스레드가 이 메서드를 사용하면 lock을 건다. */
public synchronized char pop() {
char c;
c = ((Character)(buffer.remove(buffer.size() - 1))).charValue();
return c;
}
public void push(char c) {
synchronized (this) { /* 현재의 블록 안에 있는 공유 데이터만을 lock을 건다. */
Character charObj = new Character(c);
buffer.addElement(charObj);
}
}
}
class SyncStack {
private Vector buffer = new Vector();
/* 메서드에서 사용하는 모든 공유 데이터에 하나의 스레드가 이 메서드를 사용하면 lock을 건다. */
public synchronized char pop() {
char c;
c = ((Character)(buffer.remove(buffer.size() - 1))).charValue();
return c;
}
public void push(char c) {
synchronized (this) { /* 현재의 블록 안에 있는 공유 데이터만을 lock을 건다. */
Character charObj = new Character(c);
buffer.addElement(charObj);
}
}
}
class SyncStack { private Vector buffer = new Vector(); /* 메서드에서 사용하는 모든 공유 데이터에 하나의 스레드가 이 메서드를 사용하면 lock을 건다. */ public synchronized char pop() { char c; c = ((Character)(buffer.remove(buffer.size() - 1))).charValue(); return c; } public void push(char c) { synchronized (this) { /* 현재의 블록 안에 있는 공유 데이터만을 lock을 건다. */ Character charObj = new Character(c); buffer.addElement(charObj); } } }
- wait와 notify – 프로그래머가 직접 동기화를 제어하는 것