노력과 삽질 퇴적물
JAVA: 스레드 본문
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 계열' 카테고리의 다른 글
JAVA: 시간과 날짜 (0) | 2013.07.12 |
---|---|
JAVA: 간단한 응용프로그램 (0) | 2012.08.28 |
JAVA: 이벤트처리 (0) | 2012.08.23 |
JAVA: GUI 및 프레임 (2) | 2012.08.21 |
JAVA: 자바 기초 (4) (0) | 2012.08.08 |