2012-04-13 2 views
1

나는 자주 호출되는 이벤트 메소드를 가진 클래스를 가지고있다. 메소드 이름이 onClicked라고 가정 해 보겠습니다. 메서드 내에서, 나는 물건을 만들기위한 스레드를 만들 것이다.이벤트 메서드에서 스레드 개체 : 클래스 멤버를 사용하거나 로컬 개체를 만드시겠습니까?

먼저 이벤트 메소드 내에 스레드 객체를 생성 해 보았습니다. 코드는 다음과 같다 :

public class MyService { 

    //Event method 
    public void onClick() { 
     new Thread(new Runnable() { 

      @Override 
      public void run() { 
       // do some stuff here 
      } 
     }).start(); 
    } 
} 

하지만 onclick을 자주 호출 할 것이기 때문에

, 내가 걱정하는 경우 이벤트 방법은 메모리 공간이나 성능 문제를 만들 것이라고 매번 새로 만든 스레드 개체?

또한,이 같은 클래스 멤버 스레드 솔루션을 만들 수 있습니다

public class MyService { 
    private Thread myThread; 

    //Event method 
    public void onClick() { 
     myThread = new Thread(new Runnable() { 

      @Override 
      public void run() { 
        // do some stuff here 
      } 
     }); 
     myThread.start(); 
    } 
} 

을 그래서 어떤 코드가 더 좋다? 1 일 또는 2 일? 아니면 다른 더 나은 해결책이 있습니까?

+0

진짜 질문은 아닙니다. 매번 새로운 스레드를 만들어야하는데, 선택의 여지가 없으므로 이에 대한 더 나은 방법은 없습니다. – EJP

답변

3

OnClick()에 스레드를 다시 초기화하지 않고 두 번째 코드를 사용할 수 없습니다. 이는 일단 스레드가 실행을 마쳤 으면 "죽었습니다"때문입니다. 따라서 start()에 대한 이후 호출은 실패하고 IllegalThreadStateException이됩니다.

완료 후 GC가 스레드를 제거하므로 첫 번째 코드를 사용하는 것이 좋습니다.

+0

죄송합니다. 제 2 코드에서 실수를 저 지르겠습니다. 나는 그것을 업데이트했다. 따라서 두 번째 코드에서 멤버 스레드 변수를 사용하면 메모리 절약이나 성능의 측면에서 첫 번째 코드와 어떤 차이가 있습니까? – null

+0

Thread() 생성자를 호출해야하므로 올바른 것입니다. – lrAndroid

0

때마다 onclick 때마다 새로운 스레드를 만들기 때문에 두 솔루션이 동일하다고 생각합니다. 두 번째 변수는 새로운 스레드가 생성되어 전역 변수 myThread에 할당되고 start을 호출하기 전에 다른 onclick 이벤트가 들어 와서 이전 변수를 다시 시작하지 않고 전역 변수를 다시 할당하는 상황이 발생할 수 있습니다. 난 당신이 스레드 수는 자원의 부족으로 방지하기 위해 여기에 허용되는 제어 할 수

ThreadPoolExecutor

보고 제안합니다.

+0

ThreadPoolExecutor를 사용해야하는 상황은 무엇입니까? – null

0

ExecutorService을 만들고 초기화 한 다음 onClick을 사용하여 Runnable 인터페이스를 구현하는 클래스의 인스턴스를 만들 수 있습니다. 요점은 풀의 수 (크기)를 지정하여 너무 많은 스레드를 작성하지 않는 것입니다 (ExecutorService : 수정 스레드 풀). 그게 더 좋은 방법입니다.

내가 말했듯이, 당신은 또한 작은 리팩터링을 만들 수 있으며, 자신의 클래스 이벤트를 생성하고 Runnable을 구현, 포인트 생성자를 정의하는 것입니다, 필드는 몇 가지 추가 방법도 있습니다.

+0

첫 번째 해결 방법은 evanwong과 동일합니다. 맞습니까? 두 번째 (runnable 클래스 이벤트 생성)의 경우 성능이 향상됩니까? – null

+0

성능 문제는 아니며 코드를 더 많이 디자인하고 있습니다. 그러나 풀의 스레드 수와 함께 계속 재생할 수 있습니다. 그러나 우리는 모바일 시스템 (배터리 수명/성능) –

관련 문제