본문 바로가기

thread

[Java Design Patten] Two-Phase Termination 패턴 쓰레드가 일반적인 처리를 실행하고 있는 상태를 [작업중]이라고 부르고 이 쓰레드를 중단하고 싶은 때는 [종료 요구]를 합니다. 그리고 종료에 필요한 뒷정리를 시작할 때 [종료 처리 중] 이고 여기서 끝나면 진짜로 쓰레드가 종료합니다. 종료하는 역할 public class CountupThread extends Thread {private long counter = 0;private volatile boolean shutdownRequested = false;public void shutdownRequest() {shutdownRequested = true;interrupt();}public boolean isShutdownRequested () {return shutdownRequested;}public.. 더보기
[Java Design Patten] Future 패턴 케이크를 사러 빵집에 갔습니다. 주문을 하자 주인이 저녁에 찾으러 와주세요 하면서 교환권을 줍니다. 저녁이 되어서 교환권을 들고 케이크를 가지러 갔습니다. 주인은 케이크를 건네 주었습니다. Futrue 패턴은 위의 줄거리와 유사하다. 우선은 Main을 보자 host를 통해 Data를 받는다. 그리고 다른 작업(여기서는 쉬는 2초간 대기)을 하다가 데이터를 사용한다. Data를 교환권이라고 보면 되다. public static void main (String[] agrs) {System.out.println("main BEGIN");final Host host = new Host();final Data data1 = host.request(10, 'A');final Data data2 = host.requ.. 더보기
코드 변경불가능성 관련 규칙 Effective Java에서 블로흐는 코드의 변경불가능성과 관련해서 다음과 같은 다섯 가지 규칙을 권장했다. 1. 객체의 상태를 변경시키는 메서드를 제공하지 마라.2. 클래스가 상속되지 못하도록 (final로) 만들어라.3. 모든 필드를 final로 선언하라.4. 모든 필드를 private으로 선언하라.5. 변경불가능성을 만족시키지 못하는 컴포넌트에 대한 접근을 통제하라. 블로흐가 말하는 다섯 가지 규칙은 멀티쓰레딩 환경에서 특히 중요한 의미를 갖기 때문에 어떤 언어를 사용하는가와 상관없이 잘 기억해두면 좋다. 더보기
[Java Design Patten] Worker Thread 패턴 Worker Thread 패턴에서는 Worker thread가 일을 하니씩 가지러 가고, 또 처리합니다. 일이 없으면 Worker thread는 새로운 일이 올때까지 대기합니다. Client 역할업무를 작성하여 Channel역할에게 일을 전 달 public class ClientThread extends Thread {private final Channel channel;private static final Random random = new Random();public ClientThread (final String name, final Channel channel) {super(name);this.channel = channel;} public void run () {try {for (int i=0;.. 더보기
[Java Design Patten] Thread per Message 패턴 이번 패턴을 간단하게 요약해서 이야기하면"어떠한 명령이나 요구마다 새로 한개의 쓰레드가 할당되고 그 쓰레드가 처리를 실행한다." 역할은 Client, Host, Helper로 나눌 수 있다. Client는 Request를 요구하는 역할이다. 여기선 Main이 담당 public class Main {public static void main (final String[] args) {final Host host = new Host();host.request(10,'A');host.request(20,'B');host.request(30,'C');} } Host는 Client로부터 Request를 받으면 새로운 Thread를 생성하는 역할 public class Host {private final Helper.. 더보기
[Java Design Patten] Read-Write Lock 패턴 여러개의 쓰레드가 동시에 읽는 것은 문제가 없습니다. 하지만 읽는 중간에 쓰게 되면 문제가 발생하기에 이런 경우에 사용하면 효과적이다. 읽기 쓰기 Lock을 담당 public final class ReadWriterLock {private int readingReaders = 0;private int waitingWriters = 0;private int writingWriters = 0;private boolean preferWriter = true;public synchronized void readLock () throws InterruptedException {while (writingWriters > 0 || (preferWriter && waitingWriters > 0)) {wait();}r.. 더보기
[Java Design Patten] Producer - Consumer 패턴 이 패턴에서는 Producer와 Consumer 그리고 Channel의 역할이 필요하다. Channel의 역할이 필요한 이유 Producer역할이 Consumer 역할의 처리 상황에 좌우되지 않게 하기 위함 Producer 역할 public class MakerThread extends Thread {private final Random random;private final Table table;private static int id = 0;public MakerThread (final String name, final Table table, final long seed) {super(name);this.table = table;this.random = new Random(seed);}public voi.. 더보기
[Java Design Patten] Balking 패턴 지금 이 처리를 실행하면 곤란하다거나 혹은 당장 실행할 필요가 없거나 혹은 다른 곳에서 이미 처리를 하고 있는 경우 실행을 중단하고 돌아가는 패턴이다. 가드 되어 있는 객체 역할 이며 guardedMethod와 stateChangingMethod 를 가지고 있는 패턴이다. 여기서는 save와 chage 함수를 보면 된다.public class Data {private final String filename;private String content;private boolean changed;public Data (final String filename, final String content) {this.filename = filename;this.content = content;this.changed = .. 더보기
[Java Design Patten] Guarded Suspension 이 처리를 실행하면 안 될 때 처리하기 직전에 쓰레드를 기다리게 하는 패턴이다. 아래의 시퀀스 다이어그램을 참고~! public class Request {private final String name;public Request (final String name) {this.name = name;}public String getName () {return this.name;} public String toString() {return "Request [name=" + name + "]";} } public class RequestQueue { private final Queue queue = new LinkedList();public synchronized Request getRequest () {whi.. 더보기
[Java Design Patten] Immutable 상태의 변화가 없는 경우에는 synchronized를 할 필요가 없다. 여기서는 불변의 객체의 역할로 Person이 담당을 하였다. public final class Person {private final String name;private final String address;public Person (final String name, final String address) {this.name = name;this.address = address;} public String getName() {return name;} public String getAddress() {return address;} @Overridepublic String toString() {return "Person [name=" +.. 더보기