티스토리 뷰

반응형

1편 스레드 객체생성 및 실행

2편 스레드 우선순위와 객체공유 및 동기화

3편 스레드 상태 및 제어


=============

알아두기

싱글코어 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

반응형
댓글
최근에 올라온 글
최근에 달린 댓글