您的位置:首页 > 编程语言 > Java开发

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 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 + "毫秒】";
}
}

今天有点事,先走了
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: