-
2021-02-26 21:42:08
importjava.util.concurrent.Callable;importjava.util.concurrent.ExecutionException;importjava.util.concurrent.ExecutorService;importjava.util.concurrent.Executors;importjava.util.concurrent.Future;public classTestMain {public static voidmain(String[] args) {//实现一个Callable接口
Callable c = new Callable() {
@Overridepublic Netty call() throwsException {//这里是你的业务逻辑处理//让当前线程阻塞5秒看下效果
System.out.println("---sleep开始---");
Thread.sleep(5000);
System.out.println("---sleep结束---");return new Netty("张三");
}
};
System.out.println("---主线程不被阻塞,继续往下走---");/*Java通过Executors提供四种线程池,分别为:
newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。
newFixedThreadPool 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。
newScheduledThreadPool 创建一个定长线程池,支持定时及周期性任务执行。
newSingleThreadExecutor 创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。*/ExecutorService es=Executors.newCachedThreadPool();//记得要用submit,执行Callable对象
Future fn =es.submit(c);//无限循环等待任务处理完毕 如果已经处理完毕 isDone返回true
while (!fn.isDone()) {try{//处理完毕后返回的结果
Netty nt =fn.get();
System.out.println("处理完毕后返回的结果:" +nt.name);
}catch(InterruptedException e) {
e.printStackTrace();
}catch(ExecutionException e) {
e.printStackTrace();
}
}if(fn.isDone()) {
System.out.println("关闭");
es.shutdown();
}
System.out.println("全部运行结束");
}static classNetty {privateNetty(String name) {this.name =name;
}privateString name;
}
}
更多相关内容 -
Java多线程实现异步调用的方法
2020-09-03 07:27:34本文给大家分享java多线程实现异步调用的方法,感兴趣的朋友跟着脚本之家小编一起学习吧 -
java多线程异步实例
2012-11-19 11:17:28java线程异步案例,以三个线程作为案例典型,同时发起三个线程,根据不同的订单领取各自的物品,自作过程同步处理。 -
Java多线程异步处理
2020-04-21 14:34:001.异步执行无返回值 CompletableFuture noArgsFuture = CompletableFuture.runAsync(new Runnable() { @Override public void run() { System.out.println("***************"); ...1.异步执行无返回值
CompletableFuture noArgsFuture = CompletableFuture.runAsync(new Runnable() { @Override public void run() { System.out.println("***************"); } });
2.异步执行有返回值
CompletableFuture<String> returnString = CompletableFuture.supplyAsync(new Supplier<String>() { @Override public String get() { return "abc"; } }); String result = returnString.get(); System.out.println(result);
3.多个异步执行,等待所有结果返回才算完成
CompletableFuture<String> feature1 = CompletableFuture.supplyAsync(new Supplier<String>() { @Override public String get() { try { Thread.sleep(3000L); } catch (InterruptedException e) { e.printStackTrace(); } return "abc"; } }); CompletableFuture<String> feature2 = CompletableFuture.supplyAsync(new Supplier<String>() { @Override public String get() { return "def"; } }); CompletableFuture<String> feature3 = CompletableFuture.supplyAsync(new Supplier<String>() { @Override public String get() { return "ghi"; } }); CompletableFuture totalFeature = CompletableFuture.allOf(feature1, feature2, feature3); totalFeature.join(); String str3=feature3.get(); String str2=feature2.get(); String str1=feature1.get(); List<String> stringList = Stream.of(feature1, feature2, feature3).map(CompletableFuture::join).collect(Collectors.toList()); System.out.println(stringList); System.out.println(str1+str2+str3);
4.多个异步执行,有参数有返回值
//模拟入参 List<Date> dates = new ArrayList<>(); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); try { dates.add(sdf.parse("2020-02-22 12:12:01")); dates.add(sdf.parse("2020-02-23 12:12:01")); dates.add(sdf.parse("2020-02-24 12:12:01")); } catch (ParseException e) { e.printStackTrace(); } List<CompletableFuture<String>> futures = new ArrayList<>(); //将任务提交,并异步执行 for (Date date : dates) { CompletableFuture<String> newFeature = CompletableFuture.supplyAsync(new Supplier<String>() { @Override public String get() { //异步处理逻辑,这里将日期转换为字符串 return coverLongToString(date); } }); futures.add(newFeature); } //所有任务执行完成返回才会继续,不然会阻塞在这里等待 //TODO 这里怎么能够设置下超时时间 CompletableFuture.allOf(futures.iterator().next()); //拿到所有异步线程返回的结果 List<String> dateStringList = futures.stream().map(CompletableFuture::join).collect(Collectors.toList()); System.out.println(dateStringList);
-
Java创建多线程异步执行实现代码解析
2020-08-18 17:48:08主要介绍了Java创建多线程异步执行实现代码解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 -
Java多线程实现异步调用实例
2014-09-18 15:09:21Java多线程实现异步调用实例。运行Main可以看到结果。main是主线程,另有A,B,C三个线程用不同的时间跑完。 -
java多线程读取多个文件的方法
2020-08-25 17:01:35主要为大家详细介绍了java多线程读取多个文件的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 -
java多线程异步和阻塞性调用方式
2018-04-26 11:39:10java多线程可以直接通过ExecutorService接口的execute方法提交任务,也可以通过invokeAll方法让多个任务一起提交,前者execute是异步提交,也就是说不会阻塞主线程,后则会阻塞主线程,等待所有任务执行完成主线程才...java多线程可以直接通过ExecutorService接口的execute方法提交任务,也可以通过invokeAll方法让多个任务一起提交,前者execute是异步提交,也就是说不会阻塞主线程,后则会阻塞主线程,等待所有任务执行完成主线程才回继续执行。其实不管是execute还是invokeAll,它们最终都会去执行Executor接口的execute(Runnable run)方法,下面是截取的部分源码
很明显invokeAll方法调用了execute,并且传入的是一个继承自Runnable接口的RunnableFuture对象,所以其实它们的原理是一样的, 还有一点注意到了,这里还调用了Future对象的get,这个方法是阻塞性的,这也是为什么invokeAll会阻塞主线程的原因。
-
java多线程导出excel(千万级别)优化
2018-12-05 14:29:01轻松解决普通poi形式导出Excel的中出现的栈溢出问题,此资源可实现千万级数据分批导出csv文件,csv大数据量导出(千万级别,不会内存溢出),多线程导出 ,生产环境已经很稳定的使用着 -
java多线程异步
2019-05-17 17:49:29考虑一定得用多线程处理,那就首先需要线程池了,毕竟没有线程池的情况下很容易出现无休止创建线程是非常危险的。 实现 代码 伪代码 //创建线程池 ExecutorService executor = Executors.newFixedThreadPool(4)...背景
最近遇到多数据库执行sql处理后生成报表,项目原有逻辑是单线程同步执行的,随着数据量的增大时间越来越长,我忍不住要优化。考虑一定得用多线程处理,那就首先需要线程池了,毕竟没有线程池的情况下很容易出现无休止创建线程是非常危险的。
实现
代码
伪代码
//创建线程池 ExecutorService executor = Executors.newFixedThreadPool(4); CompletionService<Object> completionSevice = new ExecutorCompletionService<Object>(executor); for (DatabaseNode databaseNode: databaseNodeList) { //提交请求到具体的库 completionSevice.submit(new SqlHandler(properties, databaseNode, sql, ModuleConstant.NODE_PASSWORD_KEY, encode, userType)); } //获取执行结果 //databaseNodeList.size()只为获取节点个数,获取到的每个节点是没有顺序 for (int i = 0; i < databaseNodeList.size(); i++) { Object result = null; DrdsNodes nodeSchema = null; //获取到每个库节点执行的结果,结果是从最先执行完的开始拿的,每次拿一个 Map<DrdsNodes, Object> resultMap = (Map<DatabaseNode , Object>) completionSevice.take().get(); //后续根据具体业务操作 。。。。 } /** *具体执行sql的类 (伪代码) * */ public class SqlHandler implements Callable<Object> { private final String ddl; private JdbcTemplate jdbcTemplate; private DrdsNodes databaseNode; public SqlRowNumHandler(RdsProperties properties, DatabaseNode databaseNode, String ddl, String nodePwdKey,String encode, Integer userType) { //sql的构建封装代码 } //类实现Callable<Object>,初始化时自动调用此方法 @Override public Object call() throws Exception { //key 是数据库的实例,用以获取时区分是哪个库执行的结果 Map<DrdsNodes, Object> resultMap = Maps.newHashMap(); try { Object value = jdbcTemplate.update(ddl); resultMap.put(drdsNode, value); return resultMap; } catch (Exception e) { resultMap.put(drdsNode, e.getMessage()); return resultMap; } }
注:completionSevice.take().get();是类似于指针一样获取结果(先执行完返回的先获取到)
CompletionService实现原理
CompletionService实际上可以看做是Executor和BlockingQueue的结合体。CompletionService在接收到要执行的任务时,通过类似BlockingQueue的put和take获得任务执行的结果。CompletionService的一个实现是ExecutorCompletionService,ExecutorCompletionService把具体的计算任务交给Executor完成。
测试后发现效率提高了5倍左右。
-
java多线程之异步使用
2021-02-25 20:01:50在编程中,根据实际场景,我们有时会考虑使用异步执行来提高应用的响应速度;一个简单的例子:@Testpublic void futureTest() {// 注意使用 ExecutorService 而非 ExecutorExecutorService executorService = Executors.... -
【Java多线程】多线程实现异步调用结果返回
2020-05-18 20:01:15因此可以使用异步调用的方法,不阻塞当前其他任务的执行。 小栗子 首先我们先要创建一个线程池,可以根据自己的需求创建,什么IO密集型参数设置,CPU密集型参数的设置。这里我们仅仅想让10个任务一起跑。 ... -
浅谈java中异步多线程超时导致的服务异常
2020-09-02 02:42:38下面小编就为大家带来一篇浅谈java中异步多线程超时导致的服务异常。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧 -
Java程序框架--多线程异步处理多任务
2010-08-15 16:28:59本程序提供了一个多任务多线程异步处理框架。该框架使用简单,用户只需要继承抽象类Task,构建自己的任务类,再构造一个任务源,就可以轻松使用这个框架。 程序包里提供了一个例子Mytask 和MyTaskGenerator, 用户只... -
Java多线程之异步Future机制的原理和实现
2020-09-01 19:07:55主要为大家详细介绍了Java多线程之异步Future机制的原理和实现,感兴趣的小伙伴们可以参考一下 -
Java多线程之多线程异常捕捉
2020-09-03 10:45:38在java多线程程序中,所有线程都不允许抛出未捕获的checked exception,也就是说各个线程需要自己把自己的checked exception处理掉,通过此篇文章给大家分享Java多线程之多线程异常捕捉,需要的朋友可以参考下 -
Java 异步多线程有哪些实现方式?
2021-04-28 15:10:47异步多线程的四种方式: 继承Thread 实现Runnable接口 实现Callable+FutureTask 线程池 一、继承Thread public class ThreadTest{ public static void main(String[] args) { Thread thread = new Thread01()... -
java线程异步调用
2018-11-07 09:54:13本文主要讲解生产环境中遇到的异步加载数据问题以及相应的解决思路。 系统登录的时候,需要根据用户ID生成一些和当前...在Java程序中,如果想实现异步调用方法的功能,需要通过线程方式实现,即实现java.lang.Ru... -
Java使用多线程异步执行批量更新操作
2021-01-11 00:16:32因此,开多线程来执行批量任务是十分重要的一种批量操作思路,其实这种思路实现起来也十分简单,就拿批量更新的操作举例: 整体流程图 步骤 获取需要进行批量更新的大集合A,对大集合进行拆分操作,分成N个小集合A... -
Java多线程获取异步执行结果的多种姿势
2021-03-12 23:29:27直接另开一个线程执行即可,但是如果遇到一些需要获取执行结果的业务,就只能为了多线程异步方式再引入线程间通信逻辑,便显得捉襟见肘。 jdk 1.5以后新引入了Future和Calla -
Java多线程编程-(17)-多线程异步调用之Future模式
2017-10-30 10:27:27一、线程计数器回顾在《Java多线程编程-(6)-两种常用的线程计数器CountDownLatch和循环屏障CyclicBarrier》 这一篇中,我们使用线程计数器的方式实现了在主线程中等待计数的线程执行完之后在执行阻塞等待之后的... -
详解Java多线程处理List数据
2020-08-26 05:16:24主要介绍了Java多线程处理List数据,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧 -
Java-第七章 多线程和异步操作
2019-05-31 23:16:42用多线程只有一个目的,那就是更好的利用cpu的资源,因为所有的多线程代码都可以用单线程来实现。但其实从理解来讲,如果我们需要做很多的事情时,一个事情耗时,那么其他的任务就需要等待,造成了堵塞。最明显的... -
java 通过多线程异步方式来批量插入数据
2019-03-04 20:34:17在处理大量数据时,想要快速的处理完毕,就需要使用多线程 + 批量(插入等)处理!!! 采用简单粗暴的形式来告诉你们如何使用多线程+批量插入 来处理千万级的数据》》》 批量插入的方法: 接下来就是获取要... -
java 用线程异步导出excel
2019-08-19 17:33:56现在用的比较多的都是用POI技术来导出Excel,对于导出数据量不大的直接用POI技术按部就班实现即可,但是对于数据量大且需要导出的数据封装业务较复杂,单纯的用POI技术实现在高并发导出数据量较大时就会出现应用程序... -
java多线程:callable和futureTask获取异步任务的返回值(实现并行计算)
2022-01-02 21:26:55场景: 我们要计算1+…+10和20+…+30相加的...引言: 在之前的 java多线程入门 中介绍了java创建多线程的方法,本质上就一种:通过Thread thread = new Thread(Runnable)创建新线程对象,实现的Runnable的run方法则为们 -
Java线程异步执行多个方法
2019-06-25 12:08:46https://jingyan.baidu.com/article/20095761feaa9fcb0721b4d2.html