자바에서 멀티 쓰레드로 기능을 구현하다 보면 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 Listqueue; 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 |
댓글