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 |