package org.easyxms; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.concurrent.CountDownLatch; import com.jcraft.jsch.Session; /** * 多线程类 */ class MultiThread{ /** * 新建会话开始多线程 * @param objects ServerInfo对象列表 */ public void startMultiThread(List<ServerInfo> objects,String ssh_sftp){ CountDownLatch wait_thread_run_end = new CountDownLatch(objects.size()); ArrayList<Thread> threadArrayList = new ArrayList<Thread>(); //初始化用于存放线程的列表 if ("ssh".equals(ssh_sftp)){ ExecCommand.setCountDownLatch(wait_thread_run_end); //设置线程同步计数器的数目 ExecCommand.setIs_use_session_pool(0); for (ServerInfo serverInfo : objects){ threadArrayList.add(new Thread(new ExecCommand(serverInfo))); } } else { UploadFile.setCountDownLatch(wait_thread_run_end); UploadFile.setIs_use_session_pool(0); for (ServerInfo serverInfo : objects){ threadArrayList.add(new Thread(new UploadFile(serverInfo))); } } threadControl(threadArrayList,wait_thread_run_end); } /** * 使用已经连接的会话开始多线程 * @param session_pool 会话池 */ public void startMultiThread(HashMap<String, Session> session_pool){ int host_num = session_pool.size(); CountDownLatch wait_thread_run_end = new CountDownLatch(host_num); ExecCommand.setCountDownLatch(wait_thread_run_end); //设置线程同步计数器的数目 //初始化用于存放线程的列表 ArrayList<Thread> threadArrayList = new ArrayList<Thread>(); ExecCommand.setIs_use_session_pool(1); for (String ip : session_pool.keySet()){ Session session = session_pool.get(ip); if (session.isConnected()){ threadArrayList.add(new Thread(new ExecCommand(ip,session))); } else { HelpPrompt.printIPSessionAlreadyDisconnect(ip); } } threadControl(threadArrayList, wait_thread_run_end); } /** * 控制主线程等待所有子线程运行结束 * @param threadArrayList 要运行的线程对象列表 * @param wait_thread_run_end 程同步计数器的数目 */ public void threadControl(ArrayList<Thread> threadArrayList, CountDownLatch wait_thread_run_end){ //开始执行多线程 for (Thread thread : threadArrayList){ thread.start(); } //等待所有子线程运行结束 try { wait_thread_run_end.await(); } catch (InterruptedException e){ HelpPrompt.printInfo(e.getMessage()); } } }