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

JavaSE8基础 Callable 多线程求和计算

2017-10-08 20:55 134 查看
礼悟:
公恒学思合行悟,尊师重道存感恩。叶见寻根三返一,江河湖海同一体。
虚怀若谷良心主,愿行无悔给最苦。读书锻炼养身心,诚劝且行且珍惜。

os :windows7 x64
jdk:jdk-8u131-windows-x64
ide:Eclipse Oxygen Release (4.7.0)


Callable接口实现类:

package blog.jizuiku5;

import java.util.concurrent.Callable;

/**
* 实现Callable接口,实现 从startNum到endNum 的求和功能
*
* @author jizuiku
* @version V17.09.27
*/
public class CallableImpl implements Callable<Integer> {
// V不写的话,默认是Object
// call函数的返回值类型就是V

private int startNum;
private int endNum;

public CallableImpl(int startNum, int endNum) {
super();
this.startNum = startNum;
this.endNum = endNum;
}

public int getStartNum() {
return startNum;
}

public void setStartNum(int startNum) {
this.startNum = startNum;
}

public int getEndNum() {
return endNum;
}

public void setEndNum(int endNum) {
this.endNum = endNum;
}

@Override
public Integer call() throws Exception {
// TODO Auto-generated method stub
// sum在这里为int类型更好,装箱拆箱需要消耗资源
int sum = 0;
for (int i = startNum; i <= endNum; ++i) {
sum += i;
}

// 只发生一次装箱
return sum;
}

}


测试类:

package blog.jizuiku5;

import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;

/**
* 测试实现Callable接口的类,接收call()函数的返回值
*
* @author jizuiku
* @version V17.09.27
*/
public class CallableDemo {
public static void main(String[] args) {
// 创建线程池
ExecutorService pool = Executors.newFixedThreadPool(3);

// Future<Integer>接收返回参数
// Future一个抽象的接口
Future<Integer> f0 = pool.submit(new CallableImpl(1, 50));
Future<Integer> f1 = pool.submit(new CallableImpl(51, 80));
Future<Integer> f2 = pool.submit(new CallableImpl(81, 100));

Integer res0 = null;
Integer res1 = null;
Integer res2 = null;

try {
// get方法:如有必要,等待计算完成,然后获取其结果
// 挺好的!知道等待与协同
res0 = f0.get();
res1 = f1.get();
res2 = f2.get();
} catch (InterruptedException | ExecutionException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

// NPE要注意!
boolean flag = (res0 != null) && (res1 != null) && (res2 != null);
if (flag) {
System.out.println(res0 + res1 + res2);
} else {
System.out.println("出现错误");
}

// 结束线程池
pool.shutdown();
}

}


结果:



API手册:







  这三个截图中的内容在代码中皆有体现,可以帮助理解代码。

Java优秀,值得学习。
学习资源:itcast和itheima视频库。如果您有公开的资源,可以分享给我的话,用您的资源学习也可以。
博文是观看视频后,融入思考写成的。博文好,是老师讲得好。博文坏,是 给最苦 没认真。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: