1.Runnable, Thread


쓰레드는 전에 설명했듯이 작업을 병렬적으로 수행할 때에 사용하는데


실제로는 두개가 나란히 작동되는게 아니고 라운드로빈이라는 스케줄링 기법을 사용한다.


라운드로빈을 사용하기에 매번 똑같은 결과를 얻을 수 없고 작업 순서가 매번 다르게 실행된다.


CPU의 계산을 최대한 효율적이고 모든 프로그램에 공평하게 할당하기 위해 만들어낸 여러가지 기법들 중 하나이다.


Java에서는 Runnable인터페이스나 Thread 클래스를 상속 받아 멀티 스레드를 구현할 수 있다.


Runnable의 경우는 run메소드 작업을 정의 한 후 Thread 생성 시 안에 집에 넣는다.


Runnable로 따로 정의하지 않고 Thread의 오버라이드 된 run에 바로 정의를 하여도 문제가 없어 보통은 Thread만 단독으로 자주 쓴다.


익명객체를 사용하여 객체 선언과 동시 메소드를 1회용으로 만들수 있다.


다음 예제를 확인해보자.






package chap10.exam01.runnable;

public class Job implements Runnable {

	@Override
	public void run() {
		for(int i = 0; i < 5; i++) {
			System.out.println("워크 스레드 실행");
			try {
				Thread.sleep(500);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}

}
package chap10.exam01.runnable;

public class MainThread {

	// Main Thread를 main에서 발생 시킨다.
	// 굉장히 중요
	public static void main(String[] args) {
		
		// 함께 일해줄 WorkThread 생성(Runnable)
		// 1. work thread가 해야할 일 생성
		Runnable job = new Job();
		// 2. 일 해줄 스레드 생성
		Thread thread = new Thread(job);
		// 3. 일을 시킨다. (무조건 start로 시작함)
		thread.start();
		// 동시 실행 테스트
		for(int i = 0; i < 5; i++) {
			System.out.println("메인 스레드 실행");
			try {
				Thread.sleep(300);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}
}



익명객체를 이용한 스레드


package chap10.exam01.runnable;

public class AnonyMain {

	public static void main(String[] args) {
		// 스레드 생성(할 일) 과 같이 생성
		// 익명객체, 따로 java파일을 만들 필요가 없음
		Thread thread = new Thread() {			
			@Override
			public void run() {
				for(int i = 0; i < 5; i++) {
					System.out.println("워크 스레드 실행");
					try {
						Thread.sleep(500);
					} catch (InterruptedException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
				}
			}
		};
		// 스레드 실행
		thread.start();
		
		// 메인에서 실행할 작업
		for(int i = 0; i < 5; i++) {
			System.out.println("메인 스레드 실행");
			try {
				Thread.sleep(400);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}

	}

}


'개념 및 코딩 > 08.Thread 스레드' 카테고리의 다른 글

[JAVA]08-07.Thread Pool, Pool Block  (0) 2018.09.06
[JAVA]08-05.Demon Thread  (0) 2018.09.06
[JAVA]08-04.Thread State, Control  (0) 2018.09.06
[JAVA]08-03.Priority, Synchronized  (0) 2018.09.06
[JAVA]08-01.Thread  (0) 2018.09.04

+ Recent posts