본문 바로가기

공부/컴퓨터

서로 다른 Thread 끼리의 참조가 가능합니까?

반응형
제목 : 서로 다른 Thread 끼리의 참조가 가능합니까?
글쓴이: 조찬제(guest)   2003/10/04 21:17:25  조회수:42  줄수:142
  
안녕하세요.

항상 자바 서비스 넷에서 좋은 정보만 캐가고 ..
이번에는 감히 질문을 하나 드립니다.

전 언어에 초보 수준이라. 틀린점이 있어도
넓은 마음으로 이해해 주시기 바랍니다.



지금 제가 구상하고 있는 채팅 서버에 대한 질문입니다.
제가 구상하고 있는 채팅 서버는 거의 모든것이 쓰레드로 이루어져 있습니다.
각 쓰레드에 큐를 마련하고 그곳에다가 쓰레드가
처리할 데이터를 넣어 줍니다.
그리고 각 쓰레드는 자신의 큐를 검사하여 할일이 있으면 처리를 합니다.


A라는 스레드에서 B라는 스레드의 큐에 데이터를 넣을려고 합니다.
어떤 방식으로 행해야 하는지요?


지금 제 생각으로는 두가지의 방법이 있는데.



첫번째. 쓰레드를 실행 시키는 곳에서 각 스레드에서 사용할 큐도 생성해서
스레드 생성자의 파라미터로 큐를 넘겨 주는 방식입니다.
ex>
main() {
    Queue aqueue = new Queue();
    Queue bqueue = new Queue();
    AThread aThread = new AThread(bquque);
    BThread bThread = new BThread(bqueue);
}
public AThread {
    Queue queue;
    AThread(Queue queue) {
        this.queue = queue;
    }
    run() {
        //SomeProcess
        queue.enqueue(SomeData);
    }
}
public BThread {
    Queue queue;
    BThread(Queue queue) {
        this.queue = queue;
    }
    run() {
        if ( queue.isQueueDataExisit() ) {
            //SomeProcess
            this.sleep(1);
        }
    }
}
    



두번째 방식은 쓰레드 객체 자체를 파라미터로 넘기고
각 스레드에서 큐를 가지고 있는것입니다.
ex>
main() {
    BThread bThread = new BThread();
    AThread aThread = new AThread(bThread);
}
public AThread extends Thread {
    Queue queue;
    AThread(BThread bThread) {
        this.Queue = bThread.queue;
    }
    run() {
        //SomeProcess
        queue.enqueue(SomeData);
    }

}
public BThread extends Thread {
    Queue queue = new Queue();
    run() {
        if ( queue.isQueueDataExisit() ) {
            //SomeProcess
            this.sleep(1);
        }
}


제가 생각한 점은 다음과 같습니다.

첫번째를 사용할 경우 :
  장점 : 필요한 큐만을 파라미터로 넘겨서 사용한다.
  단점 : 객체지향의 의미를 살리지 못한다.
           ( 하나의 행동에 필요한것을 두군데에 쪼개어 놓았다. ( AThread와 main에서의 aqueue )

두번째를 사용할 경우 :
  장점 : 객체지향적(?)으로 구성되어 있다.
  단점 : 쓸데 없이 bThread 객체 전체를 넘겼다.

제가 자바를 잘 몰라 ;; 코드를 정확하지 않게 사용했지만.
대충은 이해를 하실수 있으실거라 생각합니다.
그리고 첫번째 코드와 두번째 코드 역시 제가 아직 실력이 없어서.
깔끔하게 작성하지 못하였음을 밝힙니다.

처음에는 첫번째를 생각했으나, 좀더 제대로된 설계를 위해서 두번째를 다시 생각하였습니다.
어느것이 더 좋을까요? ( 물론 실험은 안해 보았지만 ;; 아직 테스트 모듈 같은걸 잘 못만들어서 ;; )
객체지향의 장점을 살리느냐? 아니면, 좀더 예민한(?) 사용을 하느냐?

이글을 읽으시는 분들은 꼭 한번 생각해 보시고 . 답글 달아 주세요~

참고로 전 두번째 사용을 생각하고 있습니다.
파라미터를 큐를 넘기느냐 객체를 넘기느냐 인데.
어차피 쓰레드객체나 큐나 참조(포인터)를 넘길것이기 때문에
그 부분에서는 문제가 되지 않을것 같습니다.

다만 bThread.queue.enqueue() 부분에서
bThread를 하나 거쳐서 간다는 문제만 남아 있습니다.
하지만 하나의 처리(?)를 한데 묶어 두는것이 보다 더 이해하기 쉽고
좋은 코드를 만드는 것 같아서 그렇게 생각합니다.


저 두가지 말고 다른 스레드에 접근하는 방법을 알고 계시는 분도.
조언 부탁 드립니다.
( 쓰레드에 번호나 이름을 정하고, 하면 될것 같기도 한데 ;; 원체 ;; 실력이 없어서 ;; )


자세하게 설명하시기 귀찮으시다면.
필요한 자료 주소라도 부탁드립니다.


이거참 아직 코딩은 하나도 안하고 구상만 하는데도
이렇게 막히니, 초보는 정말 힘든것 같습니다.



즐거운 하루 되세요~~!! ^^


PS. 지금 막 생각했는데.
여러 큐를 묶어서 파라미터로 넘기는 방식도 좋을것 같습니다.
( 각 파라미터가 달라지지 않아도 되니깐 ;; )



제목 : Re: 생산자-소비자 관계
글쓴이: 서민구(guest)   2003/10/05 00:48:00  조회수:43  줄수:53
  
객체지향에는 저는 문외한이라.. 사실 다 괜찮게 보입니다만...
저라면 1번 혹은 3번으로 합니다. 그 이유는 큐를 다 줄 필요가 없기때문이죠.
1번의 경우 main에서 큐를 생성하기야 합니다만, 그게 문제인 것 같지는 않습니다.
main이 이 채팅 쓰레드들의 사용자라는 입장에서, 각 쓰레드에 큐를 주는 것이기
때문에 뭐 별로... 문제는 아닌 것 같군요.

그러나 그 보다는 Listener 같은 것을 사용해서 (디자인 패턴의 옵저버 패턴)
하겠습니다. AThread.addListener(bThread) 뭐 이런식으로요. 자세한건
디자인 패턴책을 참고하시구요. 자바 빈즈에도 보면 프로퍼티 변경에 대한
리스너 설정, 비토에 대한 설정등이 나오는데 역시 유익합니다.

사실 객체지향은 전 잘 모르고, 그 보다도 지금 관계를 일컬어 흔히
producer-consumer라고 하는데 그 전형적인 방법을 벗어나서 코딩하고 계셔서
글을 올립니다.

public BThread extends Thread {
    Queue queue = new Queue();
    run() {
        if ( queue.isQueueDataExisit() ) {
            //SomeProcess
            this.sleep(1);
        }
}

와 같은 모양처럼 run()이 매번 돌면서 큐에 데이터가 있냐? 하고 찾아보는 방법을
사용하시는데요.. 이런 형태는 매번 큐가 비었나를 쳐다보니까 별로 안좋습니다..
쓰레드들이 모두 달려들어 큐에 대한 메소드를 실행하니까요.

어떤식으로 구상중이신지 모르겠지만 아래와 같은 형태가 됩니다.

producer는,

wait(empty);
wait(mutex);
queue 에 데이터 추가
signal(mutex);
signal(full);

consuer는,
wait(full);
wait(mutex);
queue에서 데이터 꺼내기
signal(mutex);
signal(empty);

이런식입니다.

자바에 관련된 쓰레드 프로그래밍 서적이나, 아니면 유명한 공룡책(오퍼레이팅
시스템이란 책인데 책앞에 공룡그려져있습니다)의 thread부분에 설명이 나옵니다..

읽어보시면 도움이 되실듯..

혹시 알고계시던 거였다면 죄송합니다. (^^)(__)
반응형