2013-03-30 3 views
1

현재 프로젝트에는 다양한 TCP 프로토콜을 통해 여러 다른 호스트에 네트워크 트래픽을 보내는 작업이 포함됩니다. 나는 다른 프로토콜을위한 플러그인이 내 인터페이스를 구현함으로써 작성되고 런타임에 추가되는 "플러그인"유형 디자인을 계획 중이다.Java Threading Runnable/Callable

다음은 저의 초기 디자인입니다. 올바른 방법으로 스레딩하는 경우 좀 더 숙련 된 개발자의 조언을 듣고 싶습니다. 또한 스윙 GUI에 "다시 말하려는"방법도 있습니다.

내 기본 클래스는 내 GUI이며 JFrame을 확장하고 Netbeans를 사용하여 만들어졌습니다. 버튼을 클릭하면 모듈을로드하려고합니다 (이 경우 SSH - les은 모듈을로드하는 것에 대해 걱정하지 않습니다).

버튼 클릭에 대한 코드는 다음과 같습니다 :

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) { 
    Executor executor = Executors.newCachedThreadPool();  
    PluginWorker worker = new PluginWorker(); 
    executor.execute(worker);  
} 

그래서 첫째로, 거기에 내 노동자를 호출하는이 executor에 필요한입니까? 여기에서 SwingWorker를 사용하여 Swing GUI에서 실행을 제거 할 수 있습니까?

다음 코드는 내 PluginWorker 클래스입니다. 네트워크 검색 스레드를 시작하도록 설계된 클래스입니다.이 클래스는 필요성을 확신하지 못합니다. SwingWorker가 이에 적합 할 수 있습니까? 또한 작업의 arraylist 쉽게 최대 10,000 크기 될 수 있습니다, 그래서 내가 왜 invokeAll 함수를 사용하도록 선택 했어? 그게 최선의 관행은 무엇입니까?

public class PluginWorker implements Runnable { 
    private final ExecutorService es = Executors.newFixedThreadPool(5); 
    private final Collection<GenericPlugin> tasks = new ArrayList<>(); 


    @Override 
    public void run() { 

     SshPlugin ssh = new SshPlugin(); 
     tasks.add(ssh); 
     //tasks could easily be up to 10,000 in size, so thats why I have chosen to use the invokeAll function? 

     try {    
      es.invokeAll(tasks); 
     } catch (InterruptedException ex) { 
      Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex); 
     } 
     es.shutdown(); 
    }  
} 

마지막으로, 내가 누구에 의해 작성 될 수있다하려는 내 SshPlugin, 내 "플러그인"인터페이스 (그래서 등 getAuthor,으로 getDescription 같은 기능을 적용 할 수 있습니다)를 구현 "GenericPlugin을"확장도 구현 "호출 가능" . 이것은 arraylist에서 invokeAll을 실행할 수 있도록 필요했습니다. 이제 제 관심사는 제 플러그인이 과도하게 설계되어 있다는 것입니다. GenericPlugin에서 실제로 확장해야합니까, 내 SSHPlugin이 "플러그인"과 "호출 가능"자체를 직접 구현하는 것이 더 낫겠습니까?

+0

버튼의 actionPerformed()가 Executor를 사용해야하는지 잘 모르겠습니다. 아마도, 10,000 개의 작업을 만들고 실행하는 데 걸리는 시간에 따라 달라질 수 있습니다. – user949300

답변

0

질문에 대한 대답은 다음과 같습니다. GUI와 상호 작용할 때마다 GUI에서 지속적인 업데이트를 수행 할 때마다 javax.swing.SwingWorker을 사용해야합니다. 이 공식 튜토리얼을 통해 javax.swing.SwingWorker을 효율적으로 효과적으로 사용하는 방법을 알 수 있습니다. Worker Threads and SwingWorker

+0

SwingWorker를 사용하여 PluginWorker (Runnable을 구현)를 대체해야하지만, 아직 작업 수준에서 추가 스레딩이 필요합니다. 현재 접근 방식이 스레딩의 두 번째 레이어에서 괜찮습니까? – fixulate

+0

그래서 버튼을 클릭 한 후에 많은 스레드를 순차적으로 실행하고 있다는 말입니까? –

+0

예, 잠재적으로 10,000 개의 작업이 플러그인 수준입니다. 그래서 나는 우선 GUI에서 벗어나고 둘째로 10,000 개의 작업을 시작해야한다는 것을 알고 있습니다. – fixulate