활성 객체

Active object

활성 객체 설계 패턴은 각각 자신의 제어 쓰레드에 있는 객체에 대한 메서드 호출에서 메서드 실행을 분리한다.[1]비동기식 호출과 요청 처리를 위한 스케줄러를 사용하여 동시성을 도입하는 것이 목표다.[2]

패턴은 다음 6가지 요소로 구성된다.[3]

  • 공개적으로 액세스할 수 있는 방법을 가진 클라이언트에 대한 인터페이스를 제공하는 프록시.
  • 활성 개체에 대한 메서드 요청을 정의하는 인터페이스.
  • 클라이언트의 보류 중인 요청 목록.
  • 다음에 실행할 요청을 결정하는 스케줄러.
  • 활성 개체 방법의 구현.
  • 클라이언트가 결과를 수신하기 위한 콜백 또는 변수.

자바

Java의 활성 개체 패턴 예제.[4]

먼저 우리는 더블을 특정 값으로 설정하는 두 가지 방법을 제공하는 표준 클래스를 볼 수 있다.이 클래스는 활성 개체 패턴에 맞지 않는다.

계급 마이클래스 {      사유의 곱절로 하다 발랄하게 하다 = 0.0;          공허하게 하다 어떻게 좀 해봐.() {         발랄하게 하다 = 1.0;     }      공허하게 하다 다른 것을 해라.() {         발랄하게 하다 = 2.0;     } } 

클래스는 두 가지 방법을 동시에 호출할 수 있기 때문에 다중 스레드 시나리오에서 위험하므로 val(원자성이 아닌 여러 단계로 업데이트됨)의 값이 정의되지 않을 수 있으며 이는 고전적인 레이스 조건이다.물론 동기화를 사용하여 이 문제를 해결할 수 있는데, 이 사소한 경우에는 이 문제가 쉽게 해결된다.그러나 일단 수업이 현실적으로 복잡해지면 동기화는 매우 어려워질 수 있다.[5]

이 클래스를 활성 개체로 다시 쓰려면 다음을 수행하십시오.

계급 MyActiveObject {      사유의 곱절로 하다 발랄하게 하다 = 0.0;     사유의 블로킹큐<런너블> 디스패치 큐 = 새로운 LinkedBlockingQueue<런너블>();      공중의 MyActiveObject() {         새로운 나사산 (새로운 런너블() {                                      @오버라이드                 공중의 공허하게 하다 달리다() {                     해보다 {                         하는 동안에 (진실의) {                             디스패치 큐.받아들이다().달리다();                         }                     } 잡히다 (중단됨예외 e) {                            // 좋아, 그냥 발송인을 종료하십시오.                     }                 }             }         ).출발하다();     }      공허하게 하다 어떻게 좀 해봐.() 던지다 중단됨예외 {         디스패치 큐.놓다(새로운 런너블() {                 @오버라이드                 공중의 공허하게 하다 달리다() {                      발랄하게 하다 = 1.0;                  }             }         );     }      공허하게 하다 다른 것을 해라.() 던지다 중단됨예외 {         디스패치 큐.놓다(새로운 런너블() {                 @오버라이드                 공중의 공허하게 하다 달리다() {                      발랄하게 하다 = 2.0;                  }             }         );     } } 

자바 8(대체)

자바에서 활성 객체 패턴의 또 다른 예는 보다 짧은 솔루션을 제공하는 대신 자바 8에서 구현된다.

공중의 계급 마이클래스 {     사유의 곱절로 하다 발랄하게 하다;           // 작업용 컨테이너     // 다음에 실행할 요청 결정     // 비동기 모드=true는 작업자 스레드가 FIFO 순서에 따라 로컬 작업 대기열을 처리함을 의미한다.     // 단일 스레드만 내부 상태를 수정할 수 있음     사유의 최종의 포크조인풀 fj = 새로운 포크조인풀(1, 포크조인풀.defaultForkJoinWorkerThreadFactory, 무효의, 진실의);          // 활성 객체 방법 구현     공중의 공허하게 하다 어떻게 좀 해봐.() 던지다 중단됨예외 {         fj.처형하다(() -> { 발랄하게 하다 = 1.0; });     }       // 활성 객체 방법 구현     공중의 공허하게 하다 다른 것을 해라.() 던지다 중단됨예외 {         fj.처형하다(() -> { 발랄하게 하다 = 2.0; });     } } 

참고 항목

참조

  1. ^ Douglas C. Schmidt; Michael Stal; Hans Rohnert; Frank Buschmann (2000). Pattern-Oriented Software Architecture, Volume 2: Patterns for Concurrent and Networked Objects. John Wiley & Sons. ISBN 0-471-60695-2.
  2. ^ Bass, L, Clements, P, Kazman, R. Software Architecture in Action.애디슨 웨슬리, 2003년
  3. ^ Lavender, R. Greg; Schmidt, Douglas C. "Active Object" (PDF). Archived from the original (PDF) on 2012-07-22. Retrieved 2007-02-02.
  4. ^ Holub, Allen. "Java Active Objects - A Proposal". Archived from the original on 2013-06-22. Retrieved 2014-06-16.
  5. ^ Holub, Allen. "Java Active Objects - A Proposal". Archived from the original on 2013-06-22. Retrieved 2014-06-16.

외부 링크