티스토리 뷰
반응형
2편 스레드 우선순위와 객체공유 및 동기화
=============
알아두기
싱글코어 cpu를 이용한 멀티스레드 작업은 스레드가 번갈아가며 실행하는 동시성이라 하고
멀티코어 cpu에서 개별스레드를 동시에 작업하는것을 병렬성이라한다.
=============
스레드 우선순위란?
스레드 스케줄링에 의해 스레드들이 짦은 시간에 번갈아가면서 run()메소드를 조금씩 실행하는데 우선순위 설정으로 높은 우선순위가 낮은 우선순위 스레드보다 실행 상태를 더 많이 가지도록 스케줄링하는 것을 말한다.
우선순위는 1부터 10까지 있으며 1이 가장 우선순위가 낮고 기본적으로 따로 설정이 없으면 5로 설정이된다.
package test;
public class Ex2 {
public static void main(String[] args) {
for (int i = 1; i < 11; i++) {
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
for (int j = 0; j < 2000000000; j++) {
}
System.out.println(Thread.currentThread());
}
});
/*
* 우선순위를 설정하기위해 setPriority()메소드를 이용한다.
* 아래처럼 스레드 클래스 상수로도 사용이 가능하다.
* thread.setPriority(Thread.MAX_PRIORITY);
* thread.setPriority(Thread.MIN_PRIORITY);
* thread.setPriority(Thread.NORM_PRIORITY);
*/
if (i != 10) {
thread.setPriority(1); // 가장낮음
// thread.setPriority(Thread.MIN_PRIORITY);
} else {
thread.setPriority(10); // 가장높음
// thread.setPriority(Thread.MAX_PRIORITY);
}
thread.start();
}
}
}
결과값
Thread[Thread-3,1,main]
Thread[Thread-9,10,main]
Thread[Thread-1,1,main]
Thread[Thread-2,1,main]
Thread[Thread-8,1,main]
Thread[Thread-0,1,main]
Thread[Thread-4,1,main]
Thread[Thread-7,1,main]
Thread[Thread-5,1,main]
Thread[Thread-6,1,main]
스레드 공유객체 및 동기화 사용방법
멀티스레드에서 하나의 객체를 공유해서 작업하는경우
package test;
public class Ex2 {
public static void main(String[] args) {
Share share = new Share(); // 공유할 객체생성
Thread thread1 = new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
share.setMemory(10);
share.setMemory2(20);
}
});
Thread thread2 = new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
share.setMemory(1);
share.setMemory2(2);
}
});
thread1.start();
thread2.start();
}
public static class Share {
int memory;
int memory2;
public int getMemory() {
return memory;
}
// 하나의 작업 스레드가 작업을 다 마치기전에 다른 스레드에의해서 정보가 변경되는 경우
public void setMemory(int memory) {
this.memory = memory;
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + " " + this.memory);
}
// 하나의 작업 스레드가 작업을 다 마치기전에 다른 스레드가 사용할 수 없도록하는 경우
// 메소드 선언에 동기화(synchronized)키워드를 사용한다.
public synchronized void setMemory2(int memory2) {
this.memory2 = memory2;
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + " " + this.memory2);
}
}
}
결과값
Thread-0 1
Thread-1 1
Thread-0 20
Thread-1 2
반응형
'JAVA' 카테고리의 다른 글
(JAVA)자바 스레드(Thread) 상태 및 제어 - 3편 (0) | 2017.03.30 |
---|---|
(JAVA) 자바 스레드(Thread) 객체생성 및 실행 - 1편 (0) | 2017.03.29 |
(JAVA) 자바 소수자리수 설정 Format, DecimalFormat (0) | 2017.02.12 |
(JAVA) 자바 Math, Random 클래스 알아보기 (0) | 2017.02.12 |
(JAVA) 자바 정규표현식 Regular Expression (0) | 2017.02.12 |
댓글
최근에 올라온 글
최근에 달린 댓글