노력과 삽질 퇴적물

JAVA: 스레드 본문

프로그래밍note/언어. JAVA & JDK 계열

JAVA: 스레드

MTG 2012. 8. 27. 16:59


 


 

 

0. Runnable과 Thread비교

 

자바 Thread 와 Runnable
Runnable, Thread 차이

 

 

 

 

 

01. start()

 * 스레드 객체와 실행

//ThreadA.java

public class ThreadA extends Thread

{

public void run() // run() 재정의[오버라이드]

{

while(true)

{

System.out.print("A");

}

}

}

//ThreadMain.java

public class ThreadMain

{

public static void main(String[] args)

{

// ① 스레드 객체 생성

ThreadA ta = new ThreadA();

// ② 스레드 실행.

ta.start();

System.out.print("스레드 A  : " + ta + "\n");



//스레드 객체생성과 실행을 한꺼번에 할때는 아래처럼

//new ThreadA().start();

}

}






02. sleep()

 * sleep시간을 이용한 스레드 제어

지정된 시간후에 스레드가 재가동.

인터럽트가 잘못 걸리면 깨어나지 못하는데 깨어나지 못해도 타격이 크지 않는걸 사용.

// ClockThreadSleep.java

import java.util.Date;


public class ClockThreadSleep extends Thread

{

public void run() // run() 재정의[오버라이드]

{

while(true)

{

try {

Thread.sleep(1000); // 1000ms = 1s

} catch (InterruptedException e) {

e.printStackTrace();

}

System.out.print(new Date().toString() + "\n");

}

}

}

//ClockThreadSleepMain.java

public class ClockThreadSleepMain

{

public static void main(String[] args)

{

new ClockThreadSleep().start();

}

}








03. wait()


동기화 블록내의 스레드를 CPU 점유권을 얻을수 없는 wait 풀로 이동시켜서 대기.

깨우려면 notify()를 사용해야 한다.

데드락상태이면 곤란한 스레드를 신뢰성 있게 깨울수 있다.


 






04. stop()

 * 스레드를 직접 정지시키는건 불안정해서 이클립스에서 경고가 뜬다.

 * 스레드를 상속받은 하위클래스에서 run()을 재정의(=오버라이드)하되, 루프문의 종료조건을 통해 스레드를 정지하게 한다.

public class ThreadStop extends Thread

{

boolean start = true;

public void run()

{

while(start)

{

System.out.print("스레드 정지1\n");

System.out.print("스레드 정지2\n");

System.out.print("스레드 정지3\n");

}

}

}

public class ThreadStopMain

{

public static void main(String[] ar) throws InterruptedException

{

System.out.print("ThreadStopMain, 시작\n");

ThreadStop thstop = new ThreadStop();

thstop.start();

System.out.print("ThreadStopMain, sleep");

Thread.sleep(5000);

//thstop.stop(); //불안정해서 비권장

thstop.start = false;

System.out.print("ThreadStopMain, 종료\n");

}

}






05. setPriority()

 * 스레드의 CPU자원 점유율을 조정한다.

public class ThreadA extends Thread

{

public void run() // run() 재정의[오버라이드]

{

while(true)

{

System.out.print("A");

}

}

}

public class ThreadB extends Thread

{

public void run() // run() 재정의[오버라이드]

{

while(true)

{

System.out.print("B");

}

}

}

public class ThreadsPriorityMain

{

public static void main(String[] args)

{

//스레드 객체생성

ThreadA tha = new ThreadA();

ThreadB thb = new ThreadB();

//우선순위 1 ~ 10, 숫자가 클수록 순위가 높음(CPU 점유율로 봐도 됨.)

tha.setPriority(9);

thb.setPriority(1); 

//스레드 시작

tha.start();

thb.start();

}

}






06. synchronized()

* 스레드 동기화, 특정 스레드에 CPU를 점유중에는 다른 스레드가 난입하지 못하게 한다.

* 스레드에 안정적 = 동기화가능

   즉 웹에서는 스레드 프로그래밍이 부적합

package synchronize;


public class LowerThread extends Thread

{

Object m;

public LowerThread()

{ }

public LowerThread(Object o)

{ m = 0; }

public void run()

{

while (true)

{

synchronized (m)

{

for(char i = 'a'; i <= 'z'; i++)

{

System.out.print(i + " ");

}

}

}

}

}

package synchronize;


public class UpperThread extends Thread

{

Object m;

public UpperThread()

{ }

public UpperThread(Object o)

{ m = 0; }

public void run()

{

while (true)

{

synchronized (m)

{

for(char i = 'A'; i <= 'Z'; i++)

{

System.out.print(i + " ");

}

}

}

}

}


package synchronize;


public class ThreadSyncMain

{

public static void main(String[] args)

{

Object monitor = new Object();

UpperThread ut = new UpperThread(monitor);

LowerThread lt = new LowerThread(monitor);

ut.start();

lt.start();

}

}


* 주의사항.

무한루프라서 이클립스에서는 실행이 제한될수도 있습니다.

이클립스 1번 이상 RUN을 시켜서 bin폴더에 클래스파일들을 생성시킨후에

아래의 스샷을 참조해서 실행 가능합니다.



'프로그래밍note > 언어. JAVA & JDK 계열' 카테고리의 다른 글

안드로이드: 기초정리(1)  (0) 2012.08.28
JAVA: 간단한 응용프로그램  (0) 2012.08.28
JAVA: 이벤트처리  (0) 2012.08.23
JAVA: GUI 및 프레임  (2) 2012.08.21
JAVA: 자바 기초 (4)  (0) 2012.08.08