1.Priority


Thread에 우선순위를 부여하여 실행하는 것이다.


너무 짧은 작업이라면 우선순위 부여에 의미가 없지만 작업이 커질수록 차이가 느껴질 것이다.



package chap10.exam04.priority;

public class WorkThread extends Thread {

	public WorkThread() {
		// TODO Auto-generated constructor stub
	}

	public WorkThread(String name) {
		setName(name);
	}

	@Override
	public void run() {
		System.out.println(getName() + "의 작업 시작");
		for(int i = 0; i < 100000; i++) {
			// 이 시간동안 작업이 있다고 가정
		}
		System.out.println(getName() + "의 작업 끝");
	}

}
package chap10.exam04.priority;

public class Main {

	public static void main(String[] args) {
		// 우선 순위는 1~10까지 줄 수 있다.
		// 우선 순위가 같거나 없으면 무조건 빠른놈이 먼저다.
		// 우선 순위는 상수로도 가능하다.
		
		for(int i = 1 ; i <= 5; i++) {
			Thread th = new WorkThread(i + "번째 스레드");
			th.setPriority(i);
//			th.setPriority(Threa[d.MAX_PRIORITY);
//			th.setPriority(Thread.MIN_PRIORITY);
//			th.setPriority(Thread.NORM_PRIORITY);
			th.start();
			try {
				Thread.sleep(500);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			// 우선순위만으로는 완벽한 스레드 제어가 어렵다
		}
	}

}



2.Synchronized


Thread는 메모리를 공유하는 특성이 있기 때문에 데이터의 간섭이 일어날 수 있다.


두 개의 thread가 돌아갈 때에 같은 데이터를 수정한다면 작업의 순서도 예측하기 어렵고 값이 어떻게 바뀔지도 모르게 된다.


Synchronized는 코드를 { }괄호로 감싸서 thread가 그 부분을 읽을 때 다른 thread에서 읽지 못하게 잠궈버린다.


먼저 들어온 thread가 작업을 마치고 다음 thread가 작업을 실행하게 된다.



package chap10.exam05.sync;

public class Computer {
	private int score;

	// 동기화 이전
	//	public void setScore(int score) {
	//		this.score = score;
	//		try {
	//			Thread.sleep(2000); // 2초 슬립 (이 사이 다른 사용자가 정보 변경 가능)
	//		} catch (InterruptedException e) {
	//			// TODO Auto-generated catch block
	//			e.printStackTrace();
	//		} 
	//		System.out.println(Thread.currentThread().getName() + " : " + this.score);
	//	}

	// 동기화 메소드 방식 : 메소드 접근을 제한
	//	public synchronized void setScore(int score) {
	//		this.score = score;
	//		try {
	//			Thread.sleep(2000); // 2초 슬립 (이 사이 다른 사용자가 정보 변경 가능)
	//		} catch (InterruptedException e) {
	//			// TODO Auto-generated catch block
	//			e.printStackTrace();
	//		} 
	//		System.out.println(Thread.currentThread().getName() + " : " + this.score);
	//	}

	// 동기화 블록 방식 : 메소드 까지는 허용, 특정 구역에서 제한

	public void setScore(int score) {
		// 스레드 들이 들어와서 작동할 수 잇음
		synchronized (this) { // this는 현재 Computer 객체
			this.score = score;
			try {
				Thread.sleep(2000); // 2초 슬립 (이 사이 다른 사용자가 정보 변경 가능)
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} 
			System.out.println(Thread.currentThread().getName() + " : " + this.score);
		}
	}
}
package chap10.exam05.sync;

public class User1 extends Thread{
	private Computer com;
	public User1(Computer com) {
		setName("user 1");
		this.com = com;
	}
	@Override
	public void run() {
		com.setScore(500); // user 1은 점수를 500으로 만든다.
	}
	

}
package chap10.exam05.sync;

public class User2 extends Thread {
	private Computer com;
	
	public User2(Computer com) {
		setName("user 2");
		this.com = com;
	}

	@Override
	public void run() {
		com.setScore(100); // user2는 점수를 100으로 만든다.
	}

}
package chap10.exam05.sync;

public class PcRoom {

	public static void main(String[] args) {
		// 공용 컴퓨터 만들기
		Computer com = new Computer();
		//user1에게 컴 사용 하게 해줌
		User1 user1 = new User1(com);
		user1.start();
		//user2에게 컴 사용 하게 해줌
		User2 user2 = new User2(com);
		user2.start();
	}

}


'개념 및 코딩 > 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-02.Runnable, Thread  (0) 2018.09.04
[JAVA]08-01.Thread  (0) 2018.09.04

+ Recent posts