for(Domain domain : list){html
//往任務隊列裏添加任務多線程
taskList.add(new WorkTask(domain));List<Future<CheckDetail>> futureList = new ArrayList<Future<CheckDetail>>();app
//jdk自帶線程池,分配10個線程dom
ExecutorService service = Executors.newFixedThreadPool(10);try {socket
//線程池中多線程執行tasklist任務隊列,執行時間爲5分鐘,5分鐘執行不完就中斷執行ui
futureList = service.invokeAll(taskList,5,TimeUnit.MINUTES);Socket socket = new Socket();this
//socekt鏈接ip,port,5秒鐘後沒有鏈接指定ip則跑出SocketTimeOutException異常,表示鏈接超時線程
socket.connect(new InetSocketAddress(InetAddress.getByName(domain.getIp()), domain.getPort()),5); socket.setSoTimeout(5); br = new BufferedReader(new InputStreamReader(socket.getInputStream(),"GBK")); bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())); bw.write(accept.toString()); bw.flush(); String firstLine = br.readLine(); if(firstLine != null){ stateCode = Integer.parseInt(firstLine.split(" ")[1]); header.append(firstLine); } state = (stateCode == 200)? 1 : 2; String line = ""; while(!"".equals((line = br.readLine()))){ header.append(line+"\n"); } } catch (Exception e) { if(e instanceof SocketTimeoutException){ state = 3; logger.info("檢查域名:"+domain.getDomainname()+":"+domain.getPort()+" 鏈接超時."); }else{ state = 2; logger.info("檢查域名:"+domain.getDomainname()+":"+domain.getPort()+" 失敗."); } }finally{ try { if(bw != null) bw.close(); if(br != null) br.close(); } catch (IOException e) { logger.error("關閉輸入輸出流失敗.",e); } } CheckDetail cDetail = new CheckDetail(); cDetail.setCheckDate(new Date()); cDetail.setCheckStatus(state); cDetail.setStatusCode(stateCode); cDetail.setHeader(header.toString()); cDetail.setDomain(domain.getDomainname()); cDetail.setIp(domain.getIp()); cDetail.setPort(domain.getPort()); return cDetail; } } }