Thread는 왜 사용? 한정된 자원을 여러 사람이 공유하거나 나누어야 하는 상황에서 각 메소드가 처리되는 시간이 다르기 때문에 지연이 발생할 수 있기 때문에 사용한다.
콜백 메소드는? run() 메소드와 같이 start() 메소드로 호출 시 바로 실행되지 않고(대기하며 순서 따짐), 시스템이 적당한 시기에 대신 호출하는 콜백메소드라고 한다.
클래스 정의와 동시에 인스턴스를 생성하는 방식 → 재사용성 높임, 코드 간결해짐
//Baker.class, Baker$1.class -> 익명의 클래스로 생성됨
public class Baker {
public static void main(String[] args) {
Thread th = new Thread() {
public void run() {
}
};
}
}
ⓒ ChatServer
ⓒ ChatServerThread
ⓒ ChatClient
ⓒ ChatClientThread
ⓒ Protocol & ProtocolTest
| (파이프 or #)를 구분자로 하여 나누어서 각자의 토큰으로 정의
public class ProtocolTest {
public static void main(String[] args) {
String msg = "200|kiwi|tomato|메시지 내용"; // |를 기준으로 토큰
StringTokenizer st = new StringTokenizer(msg,"|");
String protocol = st.nextToken();
String from = st.nextToken();
String to = st.nextToken();
String msg1 = st.nextToken();
System.out.println(protocol+", "+from+", "+to+", "+msg1);
}
}
run 메소드의 경우, start()로 호출 시 바로 실행되지 않고(대기하며 순서 따짐), 시스템이 적당한 시기에 대신 호출하는 콜백메소드임.
다른 메소드와 함께 사용될 때 지연될 수 있어 호출위치와 순서 선정 중요(아래 예시 : run이 다 실행된 뒤 창이 뜨게 될 수도 있음)
public static void main(String[] args) {
ChatServer cs = new ChatServer();
//start와 run의 start의 위치 선정 중요 -> run에는 지연이 발생할 수 있어서 후순위로 넣어야 함.
cs.initDisplay();
cs.start(); //Thread 상속받았기에 바로 start메소드 사용 가능
}
이미 다른 클래스가 상속받았을 때, 인터페이스 Runnable을 implements하여 Thread를 생성하고, 메소드 run을 오버라이드하여 사용할 수 있게 된다.
import javax.swing.JFrame;
public class Customer extends JFrame implements Runnable{
public static void main(String[] args) {
Customer ct = new Customer();
Thread th = new Thread(ct);
th.start();
}
@Override
public void run() {
}