자바에서 멀티 쓰레드로 기능을 구현하다 보면 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개 파일을 압축해서 업로드 한다.
'자바(Java)' 카테고리의 다른 글
| 클린 코드: 애자일 소프트웨어 장인 정신 - 예제 (13) | 2014.04.04 |
|---|---|
| 이클립스에서 주석을 제외한 한글 찾는 정규식 (2) | 2014.02.14 |
| ConcurrentHashMap 설명 링크 (0) | 2013.11.06 |
| 무료로 제공되는 프로그래밍 서적 free programming pdf (0) | 2013.11.06 |
| Java charset detector: Solve Java String Encoding issue (15) | 2013.03.25 |
MultiThread.zip
댓글