使用线程池与内部类实现方法异步
来源:互联网 发布:红叶知弦调教 编辑:程序博客网 时间:2024/05/23 07:23
接口与工具类
- 线程池
package cn.com.wangh.system.config;import java.util.concurrent.LinkedBlockingQueue;import java.util.concurrent.ThreadPoolExecutor;import java.util.concurrent.TimeUnit;import org.springframework.context.annotation.Bean;import org.springframework.stereotype.Component;/** * * @author Administrator * */@Componentpublic class ThreadUtils { /** * 将线程池注入spring容器 * * @return */ @Bean public ThreadPoolExecutor create() { ThreadPoolExecutor pool = new ThreadPoolExecutor(5, 10, 5, TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>()); return pool; }}
- 接口
package cn.com.wangh.system.user.service;import java.util.concurrent.Future;import cn.com.wangh.system.user.bo.User;/** * * @author Administrator * */public interface UserService { /** * 同步创建 * @param username * @param password * @return */ User create(String username, String password); /** * 异步创建 * @param username * @param password * @return */ Future<User> asynchCreate(String username, String password);}
实现类
package cn.com.wangh.system.user.service.impl;import java.util.concurrent.Callable;import java.util.concurrent.Future;import java.util.concurrent.ThreadPoolExecutor;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Service;import cn.com.wangh.system.user.bo.User;import cn.com.wangh.system.user.service.UserService;/** * * @author Administrator * */@Servicepublic class UserServiceImpl implements UserService { /** * 引入线程池 */ @Autowired private ThreadPoolExecutor pool; /** * 同步创建 */ @Override public User create(String username, String password) { System.out.println("创建成功" + this); return new User(username, password); } /** * 异步创建,返回值为一个Future */ @Override public Future<User> asynchCreate(String username, String password) { // 创建内部类实例 AsynchCreate asynch = new AsynchCreate(username, password); // 内部类实现了Callable接口,可直接放入线程池执行,返回值是一个Future return pool.submit(asynch); } /** * 内部类,实现了Callable接口,泛型定义为User * @author Administrator * */ private class AsynchCreate implements Callable<User> { private String username; private String password; public AsynchCreate(String username, String password) { super(); this.username = username; this.password = password; } /** * call()方法类似于Runnable接口的run()方法,但是有泛型返回值,会抛出异常;线程启动时方法被调用 */ @Override public User call() throws Exception { System.out.println(this); // 直接调用外部类的同步方法,实现了代码复用 return create(username, password); } }}
上面代码使用spring,外部类是单例,内部类直接调用外部类业务方法,既实现了代码复用,也实现了异步;持有Future返回值后,可随时调用其阻塞方法get(),直至得到泛型结果。
阅读全文
0 0
- 使用线程池与内部类实现方法异步
- Android学习---使用异步内部类实现进度条加载效果
- JAVA中对同一问题分别使用内部类与匿名内部类实现
- 内部类实现线程例子【转】
- Runnable匿名内部类实现线程
- 【Java】定时器、线程与匿名内部类
- 内部类与匿名内部类实现接口
- 内部类与匿名内部类实现接口
- 多线程的使用技巧:使用匿名内部类来实现一个线程的创建
- Java:使用匿名内部类在方法内部定义并启动线程
- Java:使用匿名内部类在方法内部定义并启动线程
- 使用内部类来将线程隐藏在类中的几种方法
- 使用匿名内部类实现线程,new Thread(new Runnable(){}) 和 new Thread(){}
- Java实现简单的贪吃蛇小游戏(使用线程、内部类、双向链表等)
- java内部类的OC实现方法
- java [内部类]-[异常]-[多线程]-[线程池]
- JAVA内部类的作用、方法、使用
- JAVA内部类的作用、方法、使用
- 设计模式——单件模式(Singleton Pattern)
- Java中String、StringBuffer、StringBuilder的区别
- Spark ML随机森林
- Github使用教程------ Github客户端使用方法
- Left Right Action Support
- 使用线程池与内部类实现方法异步
- Spark Sql 编程式结构DataType转换 代码类小结
- 简单的纯java语言登录和注册功能
- Win32API学习笔记第七章(二)
- 第十一章(1至2节) 表示与描述
- LeetCode | 47. Permutations II
- 对Hadoop完全分布式集群下MapReduce日志的提取
- Tomcat运行Web项目,Action中实现资源同步
- JSP