java提供的线程池的使用
应用场景,比如你有个业务模块,非常耗时,并且还需要重复调用5次。
如果你写个for循环调用5次,调用一次3秒,那么5次就15秒,不是很友好。
这时,如果你用线程池就方便了,多线程跑,都跑完,收集到结果,也就是一个任务的时间。
Demo:
package com.tech.jin.thread; import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future; public class TestThread { public void test(){
int threadCount = 5;//创建线程数 ExecutorService executorService = Executors.newFixedThreadPool(threadCount); List<Future> list = new ArrayList<Future>(); long time1 = System.currentTimeMillis(); for(int i=0;i<threadCount;i++){
//如果你有一个任务调用接口
Callable c = new testCallable(i,time1);
Future f = executorService.submit(c);//这里也可以submit(Thread或Runnable) list.add(f);
} for(Future f :list){
try {
long time3 = (Long)f.get();
System.out.println(time3);
} catch (InterruptedException e) {
} catch (ExecutionException e) {
e.printStackTrace();
}
} } public static void main(String[] args) {
TestThread t = new TestThread();
t.test();
} } class testCallable implements Callable{
private int i;
private long time1; public testCallable(int i,long time1) {
this.i = i;
this.time1 = time1;
} @Override
public Object call() throws Exception {
Thread.sleep(5000-(i*1000));
long time2 = System.currentTimeMillis(); long time3 = time2-time1; System.out.println(i+"------"+time3); return time3;
} }
我们故意让前边的sleep时间长点,让后边的先执行。
结果:
4------1006
3------2006
2------3006
1------4005
0------5004
5004
4005
3006
2006
1006
跑完发现List<Future> list中存放的顺序还是按照原顺序来的,所以不用担心顺序问题。
java提供的线程池的使用的更多相关文章
- Java四种线程池的学习与总结
在Java开发中,有时遇到多线程的开发时,直接使用Thread操作,对程序的性能和维护上都是一个问题,使用Java提供的线程池来操作可以很好的解决问题. 一.new Thread的弊端 执行一个异步任 ...
- java并发包&线程池原理分析&锁的深度化
java并发包&线程池原理分析&锁的深度化 并发包 同步容器类 Vector与ArrayList区别 1.ArrayList是最常用的List实现类,内部是通过数组实现的, ...
- Java 四种线程池newCachedThreadPool,newFixedThreadPool,newScheduledThreadPool,newSingleThreadExecutor
介绍new Thread的弊端及Java四种线程池的使用,对Android同样适用.本文是基础篇,后面会分享下线程池一些高级功能. 1.new Thread的弊端执行一个异步任务你还只是如下new T ...
- Java四种线程池
Java四种线程池newCachedThreadPool,newFixedThreadPool,newScheduledThreadPool,newSingleThreadExecutor 时间:20 ...
- java并发:线程池、饱和策略、定制、扩展
一.序言 当我们需要使用线程的时候,我们可以新建一个线程,然后显式调用线程的start()方法,这样实现起来非常简便,但在某些场景下存在缺陷:如果需要同时执行多个任务(即并发的线程数量很多),频繁地创 ...
- Java多线程和线程池
转自:http://blog.csdn.net/u013142781/article/details/51387749 1.为什么要使用线程池 在Java中,如果每个请求到达就创建一个新线程,开销是相 ...
- Java多线程之线程池详解
前言 在认识线程池之前,我们需要使用线程就去创建一个线程,但是我们会发现有一个问题: 如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程就会大大降低系统的效率,因 ...
- java多线程、线程池及Spring配置线程池详解
1.java中为什么要使用多线程使用多线程,可以把一些大任务分解成多个小任务来执行,多个小任务之间互不影像,同时进行,这样,充分利用了cpu资源.2.java中简单的实现多线程的方式 继承Thread ...
- (转载)new Thread的弊端及Java四种线程池的使用
介绍new Thread的弊端及Java四种线程池的使用,对Android同样适用.本文是基础篇,后面会分享下线程池一些高级功能. 1.new Thread的弊端 执行一个异步任务你还只是如下new ...
随机推荐
- Marathon1.5以上版本配置
今天部署marathon还按照之前的方式配置,结果启动时报错 Dec 03 23:51:36 bigdata01.zetyun.com marathon[12311]: No start hook f ...
- 三维bfs(HUD1253胜利大逃亡)
#include <stdio.h>#include <string.h>int map[51][51][51];int v[51][51][51];int a,b,c,t11 ...
- IntelliJ IDEA 配置tomcat 启动项目
1.打开file中setting中搜索Application Servers,如下图 2.添加服务器类型,例如tomcat,如下图,添加完成之后可以选定tomcat的目录,tomcat Home配置t ...
- Dropout正则化和其他方法减少神经网络中的过拟合
1. 什么是Dropout(随机失活) 就是在神经网络的Dropout层,为每个神经元结点设置一个随机消除的概率,对于保留下来的神经元,我们得到一个节点较少,规模较小的网络进行训练. 标准网络和dro ...
- Unity中HideInInspector和SerializeField以及Serializable
首先,Unity会自动为Public变量做序列化,序列化的意思是说再次读取Unity时序列化的变量是有值的,不需要你再次去赋值,因为它已经被保存下来. 然后是,什么样的值会被显示在面板上? 已经被序列 ...
- 记录一则ORA-600 [13011]错误
环境:Solaris 10 + Oracle 11.2.0.1 现象:alert告警日志定期出现ORA-600 [13011]错误 1.故障现象 2.初步分析 3.匹配MOS 4.定位解决 1.故障现 ...
- 封装及调用fetch
一.封装fetch 创建fetch/index.js import 'whatwg-fetch' import 'es6-promise' export function get(url) { let ...
- c#基础思维导图
- 读写App.config配置文件的方法
我们经常会希望在程序中写入一些配置信息,例如版本号,以及数据库的连接字符串等.你可能知道在WinForm应用程序中可以利用Properties.Settings来进行类似的工作,但这些其实都利用了Ap ...
- MYSQL5.6.X 非在线安装版(解压版)安装过程
一.卸载以前旧版本(本人5.5版本) 1.关闭MySQL服务 以管理员身份运行cmd,执行以下命令: net stop mysql 或者右键我的电脑,在管理——服务——停止MySQL 2.卸载MySQ ...