博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java多线程实践
阅读量:6617 次
发布时间:2019-06-25

本文共 5174 字,大约阅读时间需要 17 分钟。

hot3.png

因为公司业务需要,需要用到多线程。

一种方法是我百度spring 多线程的解决方案。

配置文件

实现类

/** * 这里采用了Callable接口,是因为这种方式比Runable多了返回,更加适合与单元测试 */@Component@Scope("prototype")public class IOrderListVer2Task implements Callable
, Serializable { private static final long serialVersionUID = -6626027616177700489L; @Autowired private IOrderListVer2Service orderListVer2Service; private String client; private String topType; public void setClient(String client) { this.client = client; } public void setTopType(String topType) { this.topType = topType; } /** * Computes a result, or throws an exception if unable to do so. * * @return computed result * @throws Exception if unable to compute a result */ @Override public String call() throws Exception { orderListVer2Service.getOrderList(client,topType); return "调用成功"; }}

测试方法

/**	 * 比较推荐这种方法,因为这种方法更容易扩展	 */	@Test	public void test(){//		ThreadPoolTaskExecutor poolTaskExecutor = SpringContextUtil.getBean(ThreadPoolTaskExecutor.class);		try {			String[] clients = {"",""};			String[] topTypes = {"",""};			int count = 0;			for(String client:clients){				for(String topType:topTypes){					IOrderListVer2Task task = SpringContextUtil.getBean(IOrderListVer2Task.class);					task.setClient(client);					task.setTopType(topType);					Future
future = taskExecutor.submit(task); System.out.println(future.get()); } } }catch (Exception e){ e.printStackTrace(); } }

另一种方法是不用spring来实现多线程。

/** * @author zengrong.gzr * @date 2017/04/18 */public class ThreadExecutors {    private static ReentrantLock lock = new ReentrantLock();    private ThreadPoolExecutor threadPoolExecutor;    private static ThreadExecutors instance;    //默认超时两百毫秒    private static final long DEFAULT_TIME_OUT = 200;    public static ThreadExecutors getInstance() {        if (instance == null) {            lock.lock();            try {                if (instance == null) {                    instance = new ThreadExecutors();                }            } finally {                lock.unlock();            }        }        return instance;    }    private ThreadExecutors() {        threadPoolExecutor = new ThreadPoolExecutor(100, 500, 100000L, TimeUnit.MILLISECONDS,                new ArrayBlockingQueue
(2000), new ThreadPoolExecutor.CallerRunsPolicy()); } public
Future
submit(Callable
t) { return threadPoolExecutor.submit(t); } public
List
> invokeAll(List
> tasks, long timeOutMills) { try { if (timeOutMills <= 0) { timeOutMills = DEFAULT_TIME_OUT; } return threadPoolExecutor.invokeAll(tasks, timeOutMills, TimeUnit.MILLISECONDS); } catch (Throwable t) { return Lists.newArrayList(); } }}

在java8中,可以用lambda来简化代码

callables.add(() ->            {                try {                    activityPriceService.sendApiAndUpdateActivityPrice(activityPrice);                    return  activityPrice.getErpCode();                } catch (ApiException e) {                    e.printStackTrace();                    return "";                }            });Runnable task3 = () -> {                try {                    activityPriceService.sendApiAndUpdateActivityPrice(activityPrice);                } catch (ApiException e) {                    e.printStackTrace();                }            }; activityPrices.stream().forEach(activityPrice -> {            callables.add(() -> {                try {                    activityPriceService.sendApiAndUpdateActivityPrice(activityPrice);                    return activityPrice.getErpCode();                } catch (ApiException e) {                    e.printStackTrace();                    return "";                }            });        }); //这种方式是可以的            new Thread( () -> System.out.println("In Java8, Lambda expression rocks !!") ).start();//            new Callable
( () -> test(activityPrice) ).call(); Callable
c = () -> () -> { System.out.println("Hello from Callable"); }; Callable
[] c3 =new Callable[]{ ()->test(activityPrice), ()->"Hello from Callable b", ()->"Hello from Callable c" }; Callable
c5 = () -> "Hello from Callable"; Callable
c6 = () -> test(activityPrice); callables.add(() -> test(activityPrice)); //下面是lambda的实现方式,可以参考一下 /*activityPrices.stream().forEach(activityPrice -> { callables.add(() -> { try { activityPriceService.sendApiAndUpdateActivityPrice(activityPrice); return activityPrice.getErpCode(); } catch (ApiException e) { e.printStackTrace(); return null; } }); });*/

发现有一个博客讲的特别好

转载于:https://my.oschina.net/miaojiangmin/blog/1512287

你可能感兴趣的文章
5G网络不止能1秒下一部电影,它还能够…
查看>>
中国电信集采终端6700万部 金额达1070亿元
查看>>
2016年的十个数据中心故事
查看>>
《Java并发编程的艺术》一一3.3 顺序一致性
查看>>
《设计之外——比修图更重要的111件事》—第1部分3 虚心学习
查看>>
EVCache —— Netflix 的分布式内存数据存储
查看>>
《用友ERP-U8(8.72版)标准财务模拟实训》——1.4 系统管理注册和导入演示账套...
查看>>
springboot docker笔记
查看>>
服务化改造实践 | 如何在 Dubbo 中支持 REST
查看>>
【第8章】JVM内存管理
查看>>
ovirt官方安装文档 附录G
查看>>
磁盘故障小案例
查看>>
HTML
查看>>
我的友情链接
查看>>
POJ 3335 Rotating Scoreboard 半平面交
查看>>
域名和网址链接被微信浏览器拦截怎么办 微信屏蔽网址打开如何解决
查看>>
使用SQL Server Analysis Services数据挖掘的关联规则实现商品推荐功能(二)
查看>>
ubuntu下安装jdk
查看>>
python操作数据库-安装
查看>>
你真的了解interface和内部类么
查看>>