|
목록으로 | 수정 | 삭제 | 정보추가[reply] | 신규입력 |
쓰레드1. 멀티 태스킹과 멀티 쓰래드의 차이점
|
Thread class를 상속한다 |
↓ |
쓰레드 내용을 run()메소드에 오버라이드 한다. |
↓ |
해당 클래스를 객체로 생성 |
↓ |
클래스 객체에 start()메서드 호출(지정) |
1) 단독의 상속일 경우
class class_name extends Thread { public void run() { 쓰레드에서 수행할 프로그램 작성; }
class_name obj = new class_name(); obj.start(); } |
2) 이미 다른 클래스를 상속하고 있을 경우(예 Applet을 이미 상속하고 있을 경우)
class class_name extends Applet implements Runnable { public void run() { 쓰레드에서 수행할 프로그램 작성; } class_name obj = new class_name(); Thread t=new Thread(obj); t.start(); } |
3) run() 메소드와 start() 메소드의 관계
프로그래머는 start()만을 호출할 수 있다. 프로그래머가 start()를 호출하면 자바 가상머신은 해당 쓰레드를 Ready 상태로 바꾸고, 쓰레드 스케쥴러가 run()상태로 바꾸어 비로소 run() 메소드가 실행되는 것이다.
4. Thread 예(단독상속)
1) 매소드 사용안함
class ac_Thread_1 extends Thread { int i,sum;
public void run() { for(i=0 ; i<11 ; ++i) { try { Thread.sleep(500);} catch(InterruptedException e) { }
sum=sum+i; System.out.println("sum="+sum); } }
public static void main(String[] args) { ac_Thread_1 t1=new ac_Thread_1(); ac_Thread_1 t2=new ac_Thread_1();
t1.start(); t2.start(); } } |
2) 메소드 사용
class ac_Thread_1 extends Thread { int i, sum;
public void prn() { i=i+1; sum=sum+i; System.out.println("sum="+sum); }
public void run() { for(int i=0 ; i<11 ; ++i) { try { Thread.sleep(500);} catch(InterruptedException e) { }
prn(); } }
public static void main(String[] args) { ac_Thread_1 t1=new ac_Thread_1(); ac_Thread_1 t2=new ac_Thread_1(); t1.start(); t2.start(); } } |
3) 외부 클래스 사용
class ac_Thread_1 extends Thread { public void run() { ac_Thread_1_sub ts=new ac_Thread_1_sub();
for(int i=0 ; i<11 ; ++i) { try { Thread.sleep(500);} catch(InterruptedException e) { }
ts.prn(); } }
public static void main(String[] args) { ac_Thread_1 t1=new ac_Thread_1(); ac_Thread_1 t2=new ac_Thread_1(); t1.start(); t2.start(); } }
class ac_Thread_1_sub { int i,sum;
void prn() { i=i+1; sum=sum+i; System.out.println("sub_sum="+sum); }
}; |
4) 외부 클래스가 Thread를 상속하였을 때
//========================================================= // Thread - 외부 클래스가 쓰레드일 경우 //--------------------------------------------------------- // 제 목 : Thread 사용하기4 // 작성자 : 박원기 // 작성일 : 2002 //=========================================================
class ac_Thread_4 { public static void main(String[] args) { //Thread t1=new ac_Thread_4_sub1(); //Thread t2=new ac_Thread_4_sub2();
ac_Thread_4_sub1 sub_t1=new ac_Thread_4_sub1(); ac_Thread_4_sub2 sub_t2=new ac_Thread_4_sub2();
Thread t1=new Thread(sub_t1); Thread t2=new Thread(sub_t2);
t1.start(); t2.start();
} }
class ac_Thread_4_sub1 extends Thread { int i, sum; public void run() { for(i=1 ; i<10 ; i=i+2) { System.out.println("Thread 1 " + i); try { sleep(500); } catch (InterruptedException e) { } } } };
class ac_Thread_4_sub2 extends Thread { int i, sum; public void run() { for(i=0 ; i<10 ; i=i+2) { System.out.println("Thread 2 " + i); try { sleep(500); } catch (InterruptedException e) { } } } }; |
5. 다중 상속일 경우(Applet 사용)
1)
//========================================================= // Applet //--------------------------------------------------------- // 제 목 : Thread 사용하기2 // 작성자 : 박원기 // 작성일 : 2002 //=========================================================
import java.awt.*; import java.applet.*;
public class ap_Thread extends Applet implements Runnable { int i,sum;
public void init() { resize(500,500); setBackground(Color.white); }
public void start() { Thread t= new Thread(this);
t.start(); }
public void paint(Graphics g) { g.drawString("sum="+sum,40,i); }
public void draw(int i) { Graphics g=getGraphics(); sum=sum+1; g.drawString("sum="+sum,40,i); } public void run() {
for(i=50; i<400 ; i=i+15) { //repaint(); draw(i);
try { Thread.sleep(500); } catch (InterruptedException e) { } } }
}
|
목록으로 | 수정 | 삭제 | 정보추가[reply] | 신규입력 |