2012-06-19 4 views
1

저는 소켓 연결을 통해 PC와 통신 할 수있는 안드로이드 폰용 간단한 애플리케이션을 작성하고 있습니다.소켓을 통해 읽기/쓰기 할 때마다 새 스레드를 만들어야합니까?

전화는 언제든지 메시지를 쓰거나받을 수 있으며 컴퓨터도 마찬가지입니다. 내가 지금까지 사용한 이 솔루션은 다음과 같이 작동

Create a thread and call READ in it. 
Run an infinte loop. 
    Check if thread has finished, 
     If so grab the READ and process, 
     Then start a new thread also calling read. 
    Check to see if another object working in another thread wants to write, 
     If so grab and write. 

을 특히, 내가 스레드를 실행하는 안드로이드 API에서 AsyncTask를 사용하고 있습니다.

모두 잘 작동하지만 각 읽기에 대해 새 스레드를 작성하면 성능이 너무 높거나 코딩이 나쁜지 궁금합니다. 그렇다면 동일한 스레드가 동일한 동작을하도록 재사용하는 방법은 무엇입니까?

또는이 상황을 전반적으로 처리하는 더 좋은 방법이 있습니까?

미리 조언 해 주셔서 감사합니다.

+0

얼마나 많은 연결을 동시에 볼 수 있습니까? – Gray

+0

이 응용 프로그램에는 오직 하나의 클라이언트 만 있습니다. 응용 프로그램이 쓰기를 원할 때 READ가 차단되지 않도록 스레드를 사용합니다. – yellow

답변

2

예, 각 읽기에 대해 새 스레드를 만드는 것은 설명 된 필요성에 비해 상당히 비효율적입니다.

대신 단일 스레드, 읽기를 보유하는 List<your data type> 및 해당 데이터를 사용할 수 있음을 나타내는 세마포를 만드는 것을 고려하십시오. 스레드는 각 메시지를 읽고 목록에 넣은 다음 데이터를 기다리는 모든 메시지에 세마포를 게시합니다. 그 '무엇이든'은 목록에있는 내용을 모두 비울 때까지받은 다음 세마포어로 돌아갑니다.

+1

참고로 데이터를 공유하는 더 나은 방법은 'BlockingQueue'를 사용하는 것일 수 있습니다. 그것은'List'와 세마포어를 결합합니다. – Gray

+0

아, 아마도 이것이 구현하기에 가장 쉬운 솔루션이라고 생각합니다. 이미 모든 것을 설정하고 작동 시켰습니다. 단지 성능에 관심이 있습니다. 이것은 현재 프로그램에 구현하기 쉽고 문제를 해결하는 것처럼 보입니다. – yellow

0

하나의 읽기 스레드와 하나의 쓰기 스레드가 필요합니다. 둘 다 BlockingQueue를 사용하여 나머지 응용 프로그램과 인터페이스해야합니다. 왜 내가 쓰고 싶은 스레드가 여러 개 있는지 이해할 수는 없지만.

관련 문제