본문 바로가기
자바(Java)

자바에서 멀티 쓰레드(Multi Thread)

by SSaMKJ 2013. 4. 30.

자바에서 멀티 쓰레드로 기능을 구현하다 보면 lock이 걸릴 수 있다.

이 때 가장 많이 사용하는 방법이 synchronized 인데, 이 보다 더 낫은 방법이 있어서 저장하려 한다.



package com.ssamkj.test;

import java.util.ArrayList;
import java.util.List;

import org.eclipse.core.internal.jobs.JobManager;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.jobs.IJobManager;
import org.eclipse.core.runtime.jobs.ILock;
import org.eclipse.core.runtime.jobs.Job;
import org.junit.Test;

public class MultiThread {
	@Test
	public void main() {
		MultiThread th = new MultiThread();
		th.run();
	}

	private class MyThread extends Thread {
		private final List queue;
		private final String word;
		private final ILock lock;

		public MyThread(ILock lock, List queue, String word) {
			this.lock = lock;
			this.queue = queue;
			this.word = word;
		}

		@Override
		public void run() {
			for (int i = 0; i < 10000; i++) {
				try {
					lock.acquire(100);
					queue.add(word);
					System.out.println("i = "+i+": word = " + word);
				}catch (InterruptedException e) {
					System.out.println("0.1 초간 대기했지만, queue를 확보하지 못했습니다.");
				} finally {
					lock.release();
					System.out.println("finally");
				}
			}
		}
	}

	private void run() {
		List queue = new ArrayList();

		ILock lock = JobManager.getInstance().newLock();

		MyThread m1 = new MyThread(lock, queue, "테스트1");
		MyThread m2 = new MyThread(lock, queue, "테스트2");
		MyThread m3 = new MyThread(lock, queue, "테스트3");
		m1.start();
		m2.start();
		m3.start();
		
		try{Thread.sleep(1000*3);} catch (InterruptedException e){e.printStackTrace();}
	}
}





(출처 : http://eclipse.or.kr/wiki/%EC%A1%B0%EB%A6%AC%EB%B2%95:%EC%9D%B4%ED%81%B4%EB%A6%BD%EC%8A%A4%EC%97%90%EC%84%9C_%EB%8B%A4%EC%A4%91_%EC%8A%A4%EB%A0%88%EB%93%9C_%EA%B4%80%EB%A6%AC%ED%95%98%EA%B8%B0 )


lock을 걸어주고, relase 해주는 방식이며 lock시간을 정해 줄 수 있다.


synchronized 보다 더 낫은 이유는 synchronized 를 해도 한 Thread에 LOCK이 걸릴 수 있지만, 위 방식대로 하면 원하는 동작을 수행하지 못 할 수는 있어도 교착상태에 빠지는 일을 막을 수 있기 때문에 멀티 쓰레드(Multi Thread)로 구현할 기능이 있다면 반드시 적용해야 할 것이다.




관련 jar 파일을 다음과 같으며

org.eclipse.core.runtime-3.1.0.jar

org.eclipse.jface.jar

org.eclipse.osgi-3.7.1.jar

swt.jar

위 4개 파일을 압축해서 업로드 한다.


MultiThread.zip




댓글