Thread 죽였다 살리기.
후력
wipi에서 쓰레드 프로그래밍중입니다.
딱히 오류가 있는 것은 아니고, 폰에서 실행되는 것이기 때문에
필요할때만 쓰레드를 움직이고 필요하지 않은경우엔 아예 죽이고 싶습니다.
오류사항에서 설명했던 것처럼,
보통은 쓰레드 처리할 때 runnable을 상속받은 클래스의 run() 메써드의 내부에
flag를 두어서 다른 클래스에서 이 클래스를 참조하여 flag를 바꿉니다.
사용하지 않는 경우에는 단순히 thread.sleep에서 무한루프를 돌며 대기하는 식으로 구현해왔습니다.
그런데 이렇게 되면 쓰레드가 죽는게 아니고 계속 무한루프를 돌며 일정 시간마다 리소스를 잡아먹기 때문에
아예 죽여버리고 다시 쓰고 싶습니다.
내부에 플래그를 두는 것은 똑같은데 만약 쓰레드를 멈췄을 시에 아예 run의 무한루프를 탈출하도록 했습니다.
외부에선 그 쓰레드가 죽을때까지 join으로 대기하구요.
그랬다가 다시 시작할때가 문제네요.
쓰레드 클래스의 start() 메써드를 다시 실행하니까 에러가 뜹니다.
오랜만에 쓰레드 프로그래밍 해보니 헷갈리네요. 쓰레드를 실행시키는 것이 단순히 run()만 호출하는게
아닐거란건 알고 있습니다. (그렇다면 그냥 run()을 실행하는것이 옳겠죠.)
어떤식으로 구현을 해야 완전히 쓰레드를 멈추고, 다시 그 쓰레드가 run()메써드를 실행하게 되는지
궁금합니다.
-
찬솔큰
어차피 해결책은 없어요..
폰마다 특성이 있어서 되는것도 있고.. 않되는것도 있으니깐..
폰별로 다른 방식으로 하시는게 좋을것 같네요..
괜히 다 되는 방법 찾다가 시간 다 보냅니다.^^ -
거늘
wait/notify로 처리하시고 Thread pool을 가동(?)하시면 되지 않을까요? ㅎ
-
일진누나
아 wipi 프로그램이였구만요. ㅎㅎ
전 데스크탑인줄 알았는데..
sleep 이 해답이 아니라고 생각하신다면.
어찌되었건 이벤트를 감시하기 위해서는 무조건.. 하나의 쓰레드(메인쓰레드 포함) 는 무한 루프 돌아야 하고요
다른 액션 쓰레드들은 Object 객체에 들어있는 wait과 notify 방식을 이용하세요..
wait 는 써본지 하도 오래되어서 기억이 가물가물 하지만 완전히 잠재워 버리는 겁니다.
깨울려면 notify 를 이용해서 다시 -
쇼콜라데
찬님과 같은 방법으로 대체하려고 하고 있었는데, 쓰레드를 생성하는데 걸리는 오버헤드 역시 무시할 만한게 못되더라구요. 폰에 직접 올리니 역시 벼래별 문제가 다 있습니다..
-
연파랑
새로운 스레드 객체를 만들어서 start 하세요~
-
개구리
WIPI상에서는 조금 문제가 됩니다. sleep 길이를 늘리기엔 즉각적으로 반응해야 하는것이라 그러기에도 또 문제가 있네요 ^^
-
WatchOut
보통은 멈추고 다시 실행 시키지 않습니다.
sleep 이 더 좋은 방식입니다.
만약 죽였다 다시 살리려면, 모든 로직부분을 완전이 다른 클래스로 분리해야죠. 유식한 말로 DI
하지만 스레드는 가동될때 무겁습니다. 아무리 경량 프로세스라고 하지만요.
한시간에 한번씩 기동된다면 모를까.
그리고 지금 사용하시는 대부분의 윈도우 프로그램(이벤트 방식의 동작 제어 프로그램들)
들도 마찬가지로 계속 무한 루프 돌면서 이벤트를 감시 하는 방식입니다. -
물보라
쓰레드 객체를 아예 가비지 컬렉팅 해버리고 새로 할당하는 방법으로 했네요. 아직 폰에는 못올려봤지만 그럭저럭 괜찮은 것 같습니다.