현재 프로젝트에는 다양한 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이 "플러그인"과 "호출 가능"자체를 직접 구현하는 것이 더 낫겠습니까?
버튼의 actionPerformed()가 Executor를 사용해야하는지 잘 모르겠습니다. 아마도, 10,000 개의 작업을 만들고 실행하는 데 걸리는 시간에 따라 달라질 수 있습니다. – user949300