안녕하세요. 요즘 날씨도 추운데 감기 안걸리셨나 모르겠네요.
다름이 아니라 지금 개발하고 있는 프로그램에서 AsyncTask를 통해 스레드를 구현하여 돌리고 있습니다.
그런데 이 AsyncTask가 어느정도 개수가 늘어나면 수행되지 않고 대기하다가 다른 스레드가 종료되면 실행된다고 하더군요.
AsyncTask가 동시에 수행할 수 있는 스레드의 한계가 있다고 합니다.
현재 프로그램에서 사용되는 스레드는
TCP 서버
UDP 서버
UDP Multicasting Sender
연결된 목록 Aging - (일정 시간동안 멀티캐스팅패킷이 안오면 연결 끊김 확인)
이 네가지가 기본적으로 동시에 돌아가고 있습니다.
그리고 추가적으로 상황에 따라서 몇개의 스레드가 추가되고 있는데요,
대충 보니 5개 정도까지는 원활하게 진행되지만 그 이상이 되면 대기하기 시작하더군요.
AsyncTask가 아닌 일반적인 Thread-run형식의 스레드를 사용하면 더 많은 스레드를 돌릴 수 있나요?
아니면 다른 방법을 통해 좀 더 많은 스레드를 동시에 수행시킬 수 있는 방법이 있나요?
네트워크 프레임워크
Netty, Mina 로 해보세요.
비동기 방식이구요
쓰레드 자동으로 관리해줘서 초보도 서버 만들기 쉽습니다.
지정한 시간동안 아무 작업없으면 연결 끊기,
쓰레드 풀 방식으로 작업이 끝난 쓰레드 재활용 등등
건방진프로그래머 말씀대로 asynctask는 android 내부에 존재하는 static excutor 를 사용하고
linked 된 queue를 가지고 있습니다.
겪고 계신 문제는 excutor에서 thread의 갯수를 제한해뒀기 때문에 생기는 것 같습니다.
Before Android 1.6, the core pool size was 1 and the maximum pool size was 10. Since Android 1.6, the core pore size is 5, and the maximum pool size is 128. The size of the queue is 10 in both cases. The keep-alive timeout was 10 seconds before 2.3, and 1 second since then.
라고 하는데 허니컴 이후는 1개로 줄여버렸다고 하네요.
별도로 queue와 excutor를 사용하신다면 동시 수행 가능한 쓰레드를 늘일 수도 있을 것 같습니다.
java ExecutorService를 검색해보세요
어시크타스크는 일반적으로 큐에의하여 동작하더군요...
허니콤 이전에서는 최대 10개를 한번에 동시로 돌려서 올리고요(그래서 카톡 앨번에 사진 여러장보내기가 10개로 제한된듯)
허니콤 이후에서는 동시에하는것이 안전성에 문제가 있다하여 기본적으로는 싱글스레드(아무리많은 스레드더라도 하나씩 실행)
되도록 변경되었습니다. 물론 기존처럼10개를 위하여 옵션이 따로 달려있는게 있습니다.
만약 하시는 수행이 동시적으로 엄청많은 스레드를 돌려야한다면 좀 더 고민해보셔야할겁니다