java线程池的初步使用和探究
2015-10-18 11:07
330 查看
上一篇文章中已经提到了线程池的概念,就是事先创建一部分的线程来准备这,到使用的时候在进行直接调用,这样就减少了资源不停的创建和销毁带来的消耗。创建的线程是你的策略,创建号之后在有一个任务的时候就调用一个线程去执行,执行完毕之后线程放回进线程池,等待下一个任务来调用。如果任务太多就造成线程阻塞,至于阻塞的线程怎么操作就要看你的线程的阻塞策略。至于线程的策略之后我们讨论。
好了我们来看一下今天的使用吧:实现Callable接口
Callable接口和Runnable 接口一样,也是实现java的并发编程,不同的是:1.Callable是重写了接口的Call方法,而Runnable是重写了run方法。1.Callable接口是有返回值的,而Runnable是没有返回值的。3.Callable的call方法可以抛出异常,而Runnable的run方法不能抛出异常。
public class MyCallable implements Callable {
private String taskNum;
public MyCallable(String taskNum) {
this.taskNum = taskNum;
}
@Override
public Object call() throws Exception {
System.out.println("======" + taskNum + "任务启动");
Date dateTemp = new Date();
Thread.sleep(1000);
Date dateTemp2 = new Date();
long time = dateTemp2.getTime() - dateTemp.getTime();
System.out.println("======" + taskNum + "任务执行完毕");
return taskNum + "任务返回运行结果,当前任务时间【" + time + "毫秒】";
}
}
今天有点事,先走了
好了我们来看一下今天的使用吧:实现Callable接口
Callable接口和Runnable 接口一样,也是实现java的并发编程,不同的是:1.Callable是重写了接口的Call方法,而Runnable是重写了run方法。1.Callable接口是有返回值的,而Runnable是没有返回值的。3.Callable的call方法可以抛出异常,而Runnable的run方法不能抛出异常。
public class Test { public static void main(String[] args) throws ExecutionException, InterruptedException { System.out.println("==========程序开始运行========="); Date date1 = new Date(); //创建一个大小为5的线程池 int taskSize = 5; ExecutorService pool = Executors.newFixedThreadPool(taskSize); List<Future> list = Lists.newArrayList(); for (int i = 0; i < taskSize; i++) { Callable callable = new MyCallable(i + ""); //执行任务并且获取Future对象 Future future = pool.submit(callable); //用于结果收取 list.add(future); } /** * 关闭线程池,线程的执行已经结束,只是结果分析,所以可以关闭线程池 */ pool.shutdown(); for (Future future : list) { System.out.println("程序运行结果:" + future.get().toString()); } Date date2 = new Date(); System.out.println("=====程序运行结束=====,运行时间:【" + (date2.getTime() - date1.getTime()) + "】毫秒"); }
public class MyCallable implements Callable {
private String taskNum;
public MyCallable(String taskNum) {
this.taskNum = taskNum;
}
@Override
public Object call() throws Exception {
System.out.println("======" + taskNum + "任务启动");
Date dateTemp = new Date();
Thread.sleep(1000);
Date dateTemp2 = new Date();
long time = dateTemp2.getTime() - dateTemp.getTime();
System.out.println("======" + taskNum + "任务执行完毕");
return taskNum + "任务返回运行结果,当前任务时间【" + time + "毫秒】";
}
}
今天有点事,先走了
相关文章推荐
- JDBC-Java程序向mysql中插入数据的中文乱码
- Java的强制类型转换与隐式类型转换
- Java类加载原理解析
- HDU1036 Average is not Fast Enough!(java)
- JAVA中的代理技术(静态代理和动态代理)
- Java学习随笔2:Java复合赋值表达式的小问题
- LeetCode解题报告--Remove Element
- 在Eclipse中应该怎样去修改Android应用程序的包名(注意按步骤修改)
- java保存获取Web内容的文件
- java中的线程(三)——控制线程的几种简单的方法和线程同步
- java--通过DOM4J方式生成rss文件简单实例
- [jetty] lost connection with Eclipse , shutting down.
- Java学习随笔1:Java是值传递还是引用传递?
- I/O failure during classpath scanning in spring MVC
- Javassist介绍
- Javassist介绍
- Javassist介绍
- ztree异步加载简单示例(struts2)
- 启动项目出现:java.lang.NoClassDefFoundError: org/springframework/asm/ClassVisitor
- Spring4.0 学习(五)web.xml中ContextLoaderListeners的运行过程