첫째,이를 데리고 도서관에 대한 간략한 설명 :자바 디자인 : 많은 클래스에서 사용하는 데이터 객체를 처리
내가 바이트의 블록 읽기, 제공된 직렬 포트에 연속적으로 수신 도서관이 그들을 의미있는 방식으로 처리하도록 함께 전달합니다 (세부 사항은 중요하지 않습니다). 라이브러리를 조금 더 재사용 할 수 있도록하기 위해 이러한 바이트 처리가 인터페이스 (FrameProcessor)로 추상화되었습니다. 라이브러리를 사용하는 응용 프로그램과 관계없이 항상 발생하게 될 처리를 처리하기 위해 라이브러리에 몇 가지 기본 구현이 존재합니다. 그러나 응용 프로그램이 특별히 신경 쓰는 작업을 수행하는 사용자 지정 프로세서를 추가 할 수 있습니다.
이 프로세서로 전달되는 바이트 이외에도 대부분의 프로세서가 재미있을 수 있다고 보장하는 정보가 들어있는 데이터 개체 (ReceiverData)가 있습니다. 라이브러리 자체에 의해 전적으로 관리됩니다 (즉, ReceiverData의 인스턴스를 설정/유지하는 것은 응용 프로그램의 책임이 아니며 데이터를 사용할 수있는 방법에주의를 기울여서는 안됩니다). 반드시 상관하지 않을 수도 뭔가에 전달 될 데이터를 필요로하는 것 나는 정말이 방법을 좋아하지 않는다, 그러나
public interface FrameProcessor {
public boolean process(byte[] frame, ReceiverData receiverData);
}
:
는 지금, ReceiverData은 각 프로세서에 매개 변수로 전달되는 그것에 대해. 또한 ReceiverData를 신경 쓰는 프로세서의 경우, 다른 메서드 호출이있을 때 개체 참조를 전달해야합니다 (해당 메서드 호출이 해당 데이터에 액세스해야하는 경우).
FrameProcessor를 추상 클래스로 변경 한 다음 보호 된 ReceiverData 멤버에 대한 setter를 정의하는 것을 고려했습니다. 그러나 그것은 모든 종류의 FrameProcessor의 목록을 반복하고 ReceiverData 인스턴스를 설정하는 데에도 큰 도움이됩니다.
정적 스레드 된 컨텍스트 개체 (라이브러리가 여러 포트에서 동시에 수신 대기를 지원하므로 반드시 스레드 됨)에 대해서도 생각했습니다. 기본적으로, 당신은 같은 뭔가를하려는 다음
public class ThreadedContext {
private static Map<Long, ReceiverData> receiverData;
static {
receiverData = new HashMap<Long, ReceiverData>();
}
public static ReceiverData get() {
return receiverData.get(Thread.currentThread().getId());
}
public static void put(ReceiverData data) {
receiverData.put(Thread.currentThread().getId(), data);
}
}
그런 식으로, 라이브러리에있는 각 스레드가 시작했을 때, 그것은 단지에 다음 필요에 따라 사용할 수 있습니다 것이다, ThreadedContext에 그 ReceiverData에 대한 참조를 추가 할 수 있습니다 프로세서를 전달할 필요가 없습니다.
나는 이미 잘 작동하는 해결책을 얻었 기 때문에 확실히 중요한 질문입니다. 그것은 단지 나를 괴롭혔다. 생각? 더 나은 방법?
나는 'ThreadedContext' 접근법을 가장 좋아합니다. 참고로,'java.lang.ThreadLocal'이 있습니다. 스레드 ID를 키로 사용하는'HashMap' 대신에 사용할 수 있습니다. –
Torious
ReceiverData가 실제로 수행하고 포함하는 것에 대해 자세히 설명해 주시겠습니까? 그것은 나에게 약간의 FrameProcessor 서브 클래스의 멤버가되어야한다고 들리지만, 더 자세한 내용없이 말하기는 어렵다. – toto2