새로운 클래스 L02ThreadSleep.java 생성
package com.javalesson.ch19thread;
class ThreadDemo extends Thread{
int seq;
public ThreadDemo(int seq){
this.seq=seq;
}
public void run(){
System.out.println(seq+"thread start");
try {
sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(seq+"thread end");
}
}//class end
public class L02ThreadSleep {
public static void main(String[] args) {
for(int i=0;i<10;i++){
new ThreadDemo(i).start();
}
System.out.println("main thread end");
}//main end
}//class end
새로운 클래스 L03Runnable.java 생성
package com.javalesson.ch19thread;
import java.util.ArrayList;
import java.util.List;
class RunnableDemo implements Runnable{
int seq;
public RunnableDemo(int seq){
this.seq=seq;
}
public void run(){
System.out.println(seq+"thread start");
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(seq+"thread end");
}
}//class end
public class L03Runnable {
public static void main(String[] args) {
List<Thread> threads = new ArrayList<Thread>();
for(int i=0;i<10;i++){
Thread t = new Thread(new RunnableDemo(i));
t.start();
threads.add(t);
//t.join();//start와 동시에 join하면 안된다.->실행되고 있는 thread만 join됨
//모든 쓰레드가 실행되고 나서 join
}
for(int i=0;i<threads.size();i++){
try{
threads.get(i).join();
}catch(InterruptedException e){}
}
System.out.println("main thread end");
}//main end
}//class end
스레드를 실행하기
먼저 Thread 클래스의 인스턴스를 생성하고, 생성된 인스턴스의 start() 메소드를 호출한다.
스레드에게 뭔가 할 일을 주려면, Thread 클래스를 서브클래싱(subclassing)하고 run() 메소드를 오버라이드 하거나 Runnable 인터페이스를 구현하고 Runnable 객체를 Thread 생성자로 전달하는 방법이 있다.
Runnable을 사용하는 방법이 스레드가 수행하는 일이 스레드 자체로부터 깔끔하게 분리되기 때문에 선호된다.
멀티스레드 프로그램은 모든 스레드의 run() 메소드가 반환될 때 종료된다.
일반적으로 스레드의 실행 결과를 프로그램의 어딘가로 전달할 필요가 있다. 이럴 때에는 계산한 결과를 필드에 저장하고 해당 필드의 값을 반환하는 메소드를 제공하는 방법을 사용할 수 있다.
Thread의 서브클래스를 만들었다면, run() 메소드를 오버라이드 하는 것 외에는 아무것도 하지 말아야한다. Thread 클래스의 start(), interrupt(), join(), sleep()을 포함한 다른 메소드는 특별한 목적이나 가상 머신과 통신을 위해 사용된다. 따라서 run() 메소드를 오버라이드하고 필요한 추가적인 생성자와 메소드를 제공하는 것 외에는 Thread 메소드의 어떤 메소드도 변경해서는 안 된다.
Runnable 인터페이스 구현하기
Runnable은 run() 메소드 이외에는 인터페이스를 구현하는 클래스에서 제공해야 하며, 어떤 이름의 메소드도 자유롭게 만들 수 있고, 스레드의 동작이 원치 않는 방해를 받을 가능성은 전혀 없다. 이 방법은 또한 스레드가 할 일을 Applet이나 HTTPServlet 과 같은 몇몇 다른 클래스의 서브 클래스에 넣을 수 있게 한다. Runnable 객체를 Thread의 생성자로 전달하여 Runnable에 할당된 작업을 수행하는 스레드를 시작할 수 있다.
Thread를 서브클래싱 하는 것과 Runnable 인터페이스를 구현하는 것 중 어느것이 성능 면에서 더 좋다고 할 수는 없지만, 몇몇 특별한 경우에는 서브클래스 방식을 사용해야 하는 경우도 있다. 또 다른 경우에는, run() 메소드를 Thread가 아닌 전혀 다른 클래스를 상속받은 클래스 안에 구현해야 하는 상황도 있다. 자바는 다중 상속을 지원하지 않기 때문에 이러한 경우에 Thread를 추가로 상속받을 수 없다. 이런 상황에서는 반드시 Runnable 인터페이스를 구현하는 방법을 사용해야 한다.
AWT(Abstract Windwo Toolkit)
새로운 패키지 ch20awt 생성, 새로운 클래스 L01Frame.java 생성
package com.javalesson.ch20awt;
import java.awt.Frame;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
public class L01Frame{
public static void main(String[] args) {
Frame f = new Frame("AWT 수업");
f.setSize(500,300);
f.addWindowListener(new WindowListener() {
public void windowClosing(WindowEvent e) {
e.getWindow().dispose();
}
public void windowOpened(WindowEvent e) {}
public void windowClosed(WindowEvent e) {}
public void windowIconified(WindowEvent e) {}
public void windowDeiconified(WindowEvent e) {}
public void windowActivated(WindowEvent e) {}
public void windowDeactivated(WindowEvent e) {}
});
f.setVisible(true);
//awt -> GUI(Graphic User Interface)의 근본
}//main end
}//class end
'JAVA > 기본다지기' 카테고리의 다른 글
JAVA 21일차 필기 (1) | 2016.09.06 |
---|---|
JAVA 20일차 필기 (1) | 2016.09.05 |
JAVA 18일차 필기 (1) | 2016.08.31 |
JAVA 17일차 필기 (1) | 2016.08.30 |
JAVA 16일차 필기 (1) | 2016.08.29 |