2010-01-05 5 views
4

Java를 사용하여 GUI를 만들고 있습니다 (누가 아니겠습니까?). Swing Worker 클래스가 백그라운드에서 계산을 가능하게하여 GUI가 걸리지 않도록합니다. 그러나 여기에 좋은 점이 많을 지 궁금합니다.SwingWorker 클래스의 Java GUI 및 다중 인스턴스

예를 들어, 너무 많은 인스턴스가있는 경우 실행중인 이러한 백그라운드 스레드는 컴퓨터에 따라 프로그램의 성능에 영향을 미칩니 까? 간단하지만 중요한 질문입니다. 나는 모든 의견을 크게 감사 할 것입니다. 시간 내 줘서 고마워.

답변

4

예, 처리가 많을수록 자연스럽게 컴퓨터의 성능에 영향을줍니다. 결국, 처리 자원은 제한된 자원입니다.

즉, 많은 최신 컴퓨터에는 multiple cores이 있습니다. 즉, 단일 스레드 응용 프로그램은 아마도 프로세서 리소스를 최대한 활용할 수 없습니다.

일반적으로 몇 개의 스레드를 실행하는 것은 큰 문제가되지 않습니다. 그러나 일단 스레드가 수백 또는 수천이면 성능이 저하 될 수 있습니다. 스레드간에 context switch을 수행하는 데 걸리는 시간이 사용 가능한 처리 리소스의 더 많은 부분을 차지할 수 있기 때문입니다.

4

당신이 SwingWorker 코드로 탐구하면 정의는 다음 상수 볼 수 있습니다 :

/** 
* number of worker threads. 
*/ 
private static final int MAX_WORKER_THREADS = 10; 

는 따라서 배경 스레드의 수는 당신이 실제로 만들 SwingWorker의 수에 관계없이이 값을 초과하지 않을 수 있습니다 . 배경 스레딩 모델을 변화하는

한 가지 방법은 연결하는 것입니다 귀하의 SwingWorker 클래스와 연관된 AppContext에 자신의 ExecutorService. 그러나 이것은 AppContextsun.awt에 속하고 따라서 공식 JDK API의 일부가 아니므로 다소 사기성입니다.

// Create single thread executor to force all background tasks to run on the same thread. 
ExecutorService execService = Executors.newSingleThreadExecutor(); 

// Retrieve the AppContext. *CAUTION*: This is part of the sun.awt package. 
AppContext ctxt = AppContext.getAppContext(); 

// Verify that nothing is already associated with SwingWorker.class within the context. 
Object obj = ctxt.get(SwingWorker.class); 

if (obj != null) { 
    throw new IllegalStateException("Object already associated with SwingWorker: " + obj); 
} 

// Install ExecutorService. Will be retrieved by the SwingWorker when execute() is called. 
ctxt.put(SwingWorker.class, ctxt); 
+0

Aha. 그거 알아두면 좋을거야. 나는 그것을 알아 차리지 못했다. – RCC

+3

SwingWorker가 Runnable이기 때문에 SwingWorker가 스레딩을보다 잘 제어해야한다면 SwingWorkers를 자신의 ExecutorService를 통해 실행할 수 있습니다. – Sbodd

2

보유하고있는 코어 수에 따라 다릅니다. 예를 들어 두 개의 코어가있는 경우 두 개의 스레드를 생성하기 때문에 하나의 백그라운드 작업을 안전하게 생성 할 수 있습니다. 하나는 UI 용이고 다른 하나는 작업용입니다. 이는 두 코어 사이에서 잘 분리됩니다.

그러나 UI 작업은 유휴 상태 일 때가 많습니다 (사용자가 무언가를하기를 기다리는 경우). 따라서 99 %의 경우 두 코어 머신에서 두 개의 작업자 스레드 (항상 존재하는 표준 UI 스레드 외에)를 생성 할 수 있습니다

+0

하지만 Executor 객체를 통해 실행되면 SwingWorker 스레드가 항상 대기하게됩니다. – gumuruh