发布时间:2019-01-23作者:laosun阅读(3747)
executor 多线程,带多线程返回值。可判断多线程全部执行完成 isTerminated
Java虚拟机的多线程是通过线程的轮流切换并分配处理器执行时间的方式来实现的
多线程执行能帮程序提高执行效率,但是使用一定要合理慎重,否则后果很严重。.
下边博主利用中午午休的时间写一个非常使用的多线程供大家参考。
/** * .::::. * .::::::::. * ::::::::::: 佛主保佑、永无Bug * ..:::::::::::' * '::::::::::::' * .:::::::::: * '::::::::::::::.. * ..::::::::::::. * ``:::::::::::::::: * ::::``:::::::::' .:::. * ::::' ':::::' .::::::::. * .::::' :::: .:::::::'::::. * .:::' ::::: .:::::::::' ':::::. * .::' :::::.:::::::::' ':::::. * .::' ::::::::::::::' ``::::. * ...::: ::::::::::::' ``::. * ```` ':. ':::::::::' ::::.. * '.:::::' ':'````.. */ import com.google.common.collect.Maps; import com.google.common.collect.Sets; import java.util.ArrayList; import java.util.Map; import java.util.Set; import java.util.concurrent.*; /** * executor 多线程执行demo,带多线程返回值。可判断多线程全部执行完成 * @Authror sunjs * @Date 2019-01-23 12:58 */ public class ThreadDemo { private int THREAD_NUM = 5;//启动最大线程数量 private static Set<String> urlList = Sets.newConcurrentHashSet();//任务URL static{ for(int i = 1;i<=20;i++){ urlList.add("https://www.sunjs.com#"+i); } } public static void main(String[] args) { ThreadDemo td = new ThreadDemo(); td.threadExecute(); } /** * 多线程执行 * @Author sunjs * @return void * @throws * @Date 2019-01-23 13:04 */ public void threadExecute(){ //多线程 ExecutorService executor = Executors.newFixedThreadPool(THREAD_NUM); //...多种方式,具体可查阅资料了解 //ExecutorService executor2 = Executors.newCachedThreadPool(); //存储返回值 ArrayList<Future<Map<String, String>>> resultList = new ArrayList<>(); //for循环加入多线程进行执行操作 for(String str:urlList){ //这块使用Callable,不使用 Runnable。因为 Callable 带返回值 Future<Map<String, String>> result = executor.submit(new Callable<Map<String, String>>() { @Override public Map<String, String> call() throws Exception { System.out.println(Thread.currentThread().getName()+"=====>"+str); //TODO 处理业务处理(多线程) Map<String, String> map = Maps.newConcurrentMap(); map.put("threadName", Thread.currentThread().getName()); map.put("msg", str+"===>执行成功"); return map; } }); resultList.add(result); //TODO 单个线程完成处理 try { Map<String, String> map = result.get(); System.out.println("单个线程完成处理:"+map.get("threadName")+"====>"+map.get("msg")); } catch (InterruptedException e) { e.printStackTrace(); } catch (ExecutionException e) { e.printStackTrace(); } } executor.shutdown(); while(true){ if(executor.isTerminated()){ //TODO 所有线程全部处理完成 System.out.println("所有线程全部处理完成,打印结果"); if(resultList!=null && resultList.size()>0){ for(Future<Map<String, String>> fm:resultList){ try { Map<String, String> map = fm.get(); System.out.println(map.get("threadName")+"====>"+map.get("msg")); } catch (InterruptedException e) { e.printStackTrace(); } catch (ExecutionException e) { e.printStackTrace(); } } } break; } try { //停歇一秒检测一次 Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } //多线程已经抓取完毕,程序终止或者继续执行下边的操作 System.out.println("多线程已经抓取完毕,程序终止或者继续执行下边的操作"); } }
执行结果:
pool-1-thread-1=====>https://www.sunjs.com#9 单个线程完成处理:pool-1-thread-1====>https://www.sunjs.com#9===>执行成功 pool-1-thread-2=====>https://www.sunjs.com#2 单个线程完成处理:pool-1-thread-2====>https://www.sunjs.com#2===>执行成功 pool-1-thread-3=====>https://www.sunjs.com#1 单个线程完成处理:pool-1-thread-3====>https://www.sunjs.com#1===>执行成功 pool-1-thread-4=====>https://www.sunjs.com#4 单个线程完成处理:pool-1-thread-4====>https://www.sunjs.com#4===>执行成功 pool-1-thread-5=====>https://www.sunjs.com#3 单个线程完成处理:pool-1-thread-5====>https://www.sunjs.com#3===>执行成功 pool-1-thread-1=====>https://www.sunjs.com#6 单个线程完成处理:pool-1-thread-1====>https://www.sunjs.com#6===>执行成功 pool-1-thread-2=====>https://www.sunjs.com#5 单个线程完成处理:pool-1-thread-2====>https://www.sunjs.com#5===>执行成功 pool-1-thread-3=====>https://www.sunjs.com#8 单个线程完成处理:pool-1-thread-3====>https://www.sunjs.com#8===>执行成功 pool-1-thread-4=====>https://www.sunjs.com#7 单个线程完成处理:pool-1-thread-4====>https://www.sunjs.com#7===>执行成功 pool-1-thread-5=====>https://www.sunjs.com#20 单个线程完成处理:pool-1-thread-5====>https://www.sunjs.com#20===>执行成功 pool-1-thread-1=====>https://www.sunjs.com#10 单个线程完成处理:pool-1-thread-1====>https://www.sunjs.com#10===>执行成功 pool-1-thread-2=====>https://www.sunjs.com#11 单个线程完成处理:pool-1-thread-2====>https://www.sunjs.com#11===>执行成功 pool-1-thread-3=====>https://www.sunjs.com#12 单个线程完成处理:pool-1-thread-3====>https://www.sunjs.com#12===>执行成功 pool-1-thread-4=====>https://www.sunjs.com#13 单个线程完成处理:pool-1-thread-4====>https://www.sunjs.com#13===>执行成功 pool-1-thread-5=====>https://www.sunjs.com#14 单个线程完成处理:pool-1-thread-5====>https://www.sunjs.com#14===>执行成功 pool-1-thread-1=====>https://www.sunjs.com#15 单个线程完成处理:pool-1-thread-1====>https://www.sunjs.com#15===>执行成功 pool-1-thread-2=====>https://www.sunjs.com#16 单个线程完成处理:pool-1-thread-2====>https://www.sunjs.com#16===>执行成功 pool-1-thread-3=====>https://www.sunjs.com#17 单个线程完成处理:pool-1-thread-3====>https://www.sunjs.com#17===>执行成功 pool-1-thread-4=====>https://www.sunjs.com#18 单个线程完成处理:pool-1-thread-4====>https://www.sunjs.com#18===>执行成功 pool-1-thread-5=====>https://www.sunjs.com#19 单个线程完成处理:pool-1-thread-5====>https://www.sunjs.com#19===>执行成功 所有线程全部处理完成,打印结果 pool-1-thread-1====>https://www.sunjs.com#9===>执行成功 pool-1-thread-2====>https://www.sunjs.com#2===>执行成功 pool-1-thread-3====>https://www.sunjs.com#1===>执行成功 pool-1-thread-4====>https://www.sunjs.com#4===>执行成功 pool-1-thread-5====>https://www.sunjs.com#3===>执行成功 pool-1-thread-1====>https://www.sunjs.com#6===>执行成功 pool-1-thread-2====>https://www.sunjs.com#5===>执行成功 pool-1-thread-3====>https://www.sunjs.com#8===>执行成功 pool-1-thread-4====>https://www.sunjs.com#7===>执行成功 pool-1-thread-5====>https://www.sunjs.com#20===>执行成功 pool-1-thread-1====>https://www.sunjs.com#10===>执行成功 pool-1-thread-2====>https://www.sunjs.com#11===>执行成功 pool-1-thread-3====>https://www.sunjs.com#12===>执行成功 pool-1-thread-4====>https://www.sunjs.com#13===>执行成功 pool-1-thread-5====>https://www.sunjs.com#14===>执行成功 pool-1-thread-1====>https://www.sunjs.com#15===>执行成功 pool-1-thread-2====>https://www.sunjs.com#16===>执行成功 pool-1-thread-3====>https://www.sunjs.com#17===>执行成功 pool-1-thread-4====>https://www.sunjs.com#18===>执行成功 pool-1-thread-5====>https://www.sunjs.com#19===>执行成功 多线程已经抓取完毕,程序终止或者继续执行下边的操作
版权属于: 技术客
原文地址: https://www.sunjs.com/article/detail/1026e24e57b642cda236fb2a9ad96875.html
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。