자바(Java)
자바에서 멀티 쓰레드(Multi Thread)
SSaMKJ
2013. 4. 30. 15:04
자바에서 멀티 쓰레드로 기능을 구현하다 보면 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();}
}
}
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