2011-12-14 3 views
0

일부 스레드가 공유하는 싱글 톤 클래스가 있습니다. 내가 어떤 일을 할 수있는 또 다른 스레드를 만들려면이 싱글의 방법에서 싱글 톤 내에서 스레드 만들기

나는 간단한 방법으로 스레드를 시작하는 지금

을 (그래서이 싱글 톤을 사용하는 모든 스레드는 추가 스레드 작업을 시작할 수 있습니다) :

mSThread = new Thread(job that implements Runnable); 
mSThread.start(); 

스레드 mSThread, 나는 그것이 새로운 스레드가 참조가

을 잃게됩니다 만들어 질 때마다 그것을 좋아하는지 확인 그래서 내가 스레드에 대한 참조를 유지할 필요가 있다고 생각하지 않는 클래스 멤버로 선언 내가 한 짓이나 내가 한 짓을하는거야. 스레드 풀과 같은 다른 기술을 사용합니까?

+1

싱글 톤과 관련이있는 것은 아닙니다. 당신은 메소드를 가지고 있고 그것을 호출하는 사람은 그것이 완료 될 때까지 실행될 새로운 쓰레드를 생성 할 것입니다. 너무 자주 끝나지 않으면 너무 많은 스레드를 생성한다는 것은 괜찮습니다. 그런 경우에는 예 스레드 풀이 더 좋습니다.그러나 당신은 좋은 조언을하기에는 너무 적은 정보를 제공합니다. 조금만 설명하십시오. –

+0

당신은 그냥 : (새 스레드 (Runnable을 구현하는 작업)). start(); 너의 방법으로? 그렇게해야합니다. – eboix

+0

고마워,하지만 내가 뭘 더 해야할지 모르겠다. : 최대 생성 횟수는 20-30 ... – kenny

답변

3

스레드 객체에 대한 참조를 유지할 필요가 절대적으로 필요하지 않으므로 다른 용도로 필요하지 않은 경우 멤버 변수에 저장할 필요가 없습니다. 스레드를 시작하고 참조를 잊어 버릴 수 있습니다.

스레드 풀을 사용해야하는지, 정확히 응용 프로그램이 어떤지, 새 스레드를 시작할 빈도 등에 따라 달라집니다. 더 이상의 정보없이 이것이 이것이 가치있는 것인지 아닌지를 말하기는 어렵습니다. 이렇게하면 java.util.concurrent 패키지의 클래스를 사용하는 것이 좋습니다. ExecutorService을 사용하면 스레드 풀에서 백그라운드 작업을 시작할 수 있습니다.

0

제 생각에는 괜찮습니다.

실제로 여기서 직면 한 것은 조기 최적화 문제 일 수 있습니다. 스레드는 얼마나 자주 생성됩니까? 앱이 문제가되는 정도로 바쁠 것입니까? 대상 플랫폼에서 새 스레드를 만드는 데 소요되는 리소스와 시간은 얼마나 걸리는데 받아 들일 만합니까?

또 다른 질문은 관리 (JMX) 목적으로 생성 된 스레드 수를 추적하고 싶습니까?

0

스레드 mSThread는 클래스 멤버로 선언

은 당신이 싱글의 인스턴스 변수를 의미합니까? 그렇다면 문제가있을 수 있습니다. 로컬 변수로 만드는 것이 더 좋습니다.

+0

그것은 싱글턴 변수이지만, 사용하지 않는다. – kenny

+0

인스턴스 변수를 사용하든 아니든 상관없이, 두 번째 호출이 트레드 작성과 호출을 시작할 때 발생하면 시작되지 않은 새 스레드와 스레드가 시작될 수 있습니다 두 번 시작! @eboix 다른 곳에서 언급 한 것처럼'새 스레드 (Runnable을 구현하는 작업) .start(); '를 사용하는 것이 더 좋습니다. – OldCurmudgeon

1

스레드는 런타임의 부족한 리소스입니다. 메서드가 호출 될 때마다 새 메서드를 생성하는 것이 낭비입니다. 특히 여러분의 경우에는 호출 스레드가 차단되지 않도록주의해야합니다. 따라서 메서드가 너무 자주 호출되지 않도록해야합니다.

지금은에 대한 의견을 통해 알 수 있습니다. 또한 메서드를 너무 자주 호출하면 안된다는 기대를 문서화해야합니다. 그러나 미래의 일부 동료는 우발적으로이 문서를보고 빠듯한 루프로 호출 할 수 있습니다.

이러한 문제를 방지하기 위해 스레드 풀을 사용하는 것이 좋습니다. 특히 우연한 오용을 방지합니다. 특히 썬/오라클이 지저분한 세부 사항을 대부분 추상화하는 최고 java.util.concurrent 패키지를 제공 했으므로 이러한 문제를 방지 할 수 있습니다.