1.以前使用线程API并没有返回结果,Callable/Future/FutureTask正是解决了此问题,并在调用过程中
作出对异常的捕获
-Callable执行call()方法返回Object对象,也可抛出异常;调用Callable并不像Thread,而是调用<T> Future ExecutorService.submit(Callable<T> task);-Future 返回值,调用该接口的get()方法,可返回对应的对象------------------SalesCalculateSample.java>通过多线程计算矩阵每行结果并叠加;
/**
*
* @author Lean @date:2014-9-30
*/
public class SalesCalculateSample {
private static final int NUMBER_OF_MONTH=12;
private static final int NUMBER_OF_CUSTOMER=100;
private static int[][] cells;
static class Summer implements Callable<Integer>{
public int customerID;
public Summer(int companyId){
this.customerID=companyId;
}
@Override
public Integer call() throws Exception {
int sum=0;
for (int i = 0; i < NUMBER_OF_MONTH; i++) {
sum+=cells[customerID][i];
}
System.out.printf("customerID:%d ,sum:%d\n",customerID,sum);
return sum;
}
}
public static void main(String[] args) {
generateMatrix();
ExecutorService executor=Executors.newFixedThreadPool(10);
Set<Future<Integer>> futures=new HashSet<Future<Integer>>();
for (int i = 0; i < NUMBER_OF_CUSTOMER; i++) {
Callable<Integer> caller=new Summer(i);
futures.add(executor.submit(caller));
}
// caculate the sum
int sum=0;
for (Future<Integer> future : futures) {
try {
sum+=future.get();
} catch (Exception e) {
e.printStackTrace();
}
}
System.out.println("sum is>>"+sum);
executor.shutdown();
}
private static void generateMatrix() {
cells=new int[NUMBER_OF_CUSTOMER][NUMBER_OF_MONTH];
for (int i = 0; i < NUMBER_OF_CUSTOMER; i++) {
for (int j = 0; j < NUMBER_OF_MONTH; j++) {
cells[i][j]=(int)(Math.random()*100);
}
}
}
}
------------------
------------------CanCancelProcessors>随机取消提交的订单(Future提供了可取消的结果执行)
/**
*
* @author Lean @date:2014-10-7
*/
public class CanCancelProcessors {
private static ExecutorService service=Executors.newFixedThreadPool(100);
private static final int ORDERS_COUNT=2000;
private static ArrayList<Future<Integer>> futures=new ArrayList<Future<Integer>>();
public static void main(String[] args) {
for (int i = 0; i <ORDERS_COUNT; i++) {
futures.add(service.submit(new OrderExcutor(i)));
}
new Thread(new EvilThread(futures)).start();
try {
service.awaitTermination(6,TimeUnit.SECONDS);
} catch (InterruptedException e) {
e.printStackTrace();
}
int count=0;
for (Future<Integer> future : futures) {
if (future.isCancelled()) {
count++;
}
}
System.out.println("----------"+count+" orders canceled!---------");
service.shutdown();
}
static class OrderExcutor implements Callable<Integer>{
private int mId;
public OrderExcutor(int id){
this.mId=id;
}
@Override
public Integer call() throws Exception {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
}
System.out.println("successfully execute orderid : "+mId);
return mId;
}
}
static class EvilThread implements Runnable{
private ArrayList<Future<Integer>> futures;
public EvilThread(ArrayList<Future<Integer>> futures){
this.futures=futures;
}
@Override
public void run() {
for (int i = 0; i < ORDERS_COUNT; i++) {
try {
Thread.sleep(200);
boolean flag=futures.get(i).cancel(true);
System.out.println("cancel order >"+flag +" by id>> "+i);
} catch (InterruptedException e) {
}
}
}
}
}
------------------
-FutureTask 集成了Runnable与Future接口的功能,因此拥有异步,返回数据的功能;------------------FutureTaskSample
/**
*
* @author Lean @date:2014-9-30
*/
public class FutureTaskSample {
private static final int NUMBER_OF_MONTH=12;
private static final int NUMBER_OF_CUSTOMER=100;
private static int[][] cells;
static class Summer implements Callable<Integer>{
public int customerID;
public Summer(int companyId){
this.customerID=companyId;
}
@Override
public Integer call() throws Exception {
int sum=0;
for (int i = 0; i < NUMBER_OF_MONTH; i++) {
sum+=cells[customerID][i];
}
System.out.printf("customerID:%d ,sum:%d\n",customerID,sum);
return sum;
}
}
public static void main(String[] args) {
generateMatrix();
Set<FutureTask<Integer>> futures=new HashSet<FutureTask<Integer>>();
for (int i = 0; i < NUMBER_OF_CUSTOMER; i++) {
Callable<Integer> caller=new Summer(i);
FutureTask<Integer> futureTask=new FutureTask<Integer>(caller);
futureTask.run();
futures.add(futureTask);
}
// caculate the sum
int sum=0;
for (FutureTask<Integer> future : futures) {
try {
sum+=future.get();
} catch (Exception e) {
e.printStackTrace();
}
}
System.out.println("sum is>>"+sum);
}
private static void generateMatrix() {
cells=new int[NUMBER_OF_CUSTOMER][NUMBER_OF_MONTH];
for (int i = 0; i < NUMBER_OF_CUSTOMER; i++) {
for (int j = 0; j < NUMBER_OF_MONTH; j++) {
cells[i][j]=(int)(Math.random()*100);
}
}
}
}
------------------2.Executors.newFixedThreadPool()创建固定线程池.newCachedThreadPool()创建固定线程池,每个线程在60秒内不再创建.newSingleThreadExecutor()创建单线程 该线程不会被销毁.newScheduledExecutorService()创建可定时,延时执行的线程------------------ScheduledCountSample>定时,延时度取数字的例子
/**
* ScheduledExecutorServiceSample
*
* @author Lean @date:2014-10-7
*/
public class ScheduledCountSample {
private static ScheduledExecutorService mService=Executors.newScheduledThreadPool(10);
private static final int AVG=4;
private static final int mAllCount=400;
private static int mCurrenCount=0;
public static void main(String[] args) {
//delay counting !
// int times = mAllCount/AVG;
// for (int i = 0; i < times; i++) {
// mService.schedule(new tryCount(i), i*1,TimeUnit.SECONDS);
// }
// mService.scheduleAtFixedRate(new EveryCount(), 0, 1, TimeUnit.SECONDS);
mService.scheduleWithFixedDelay(new EveryCount(), 0, 1, TimeUnit.SECONDS);
}
static class EveryCount implements Runnable{
@Override
public void run() {
if (mAllCount>mCurrenCount) {
System.out.println("ThreadId>>"+Thread.currentThread().getId()+" and count >>"+mCurrenCount++);
}
}
}
static class tryCount implements Callable<Integer>{
private int Index;
public tryCount(int index) {
this.Index=index;
}
@Override
public Integer call() throws Exception {
for (int i = Index*AVG+0; i < (AVG+Index*AVG); i++) {
System.out.println("count >>"+i);
}
System.out.println("thread count end! ");
return Index;
}
}
}
------------------
-ExecutorCompletionService通常获取结果用get(),该方法形成阻塞.而通过take()获取已经结束的任务的结果
------------------
GetResultRightNow
/**
* 获取非阻塞型结果
*
* @author Lean @date:2014-10-7
*/
public class GetResultRightNow {
public static void main(String[] args) {
int[] printNum={1000,200,200,30000,5000};
ArrayList<Future<Integer>> fetures=new ArrayList<Future<Integer>>();
ExecutorService executors = Executors.newFixedThreadPool(2);
ExecutorCompletionService<Integer> service=new ExecutorCompletionService<Integer>(executors);
for (int i : printNum) {
fetures.add(service.submit(new getCurrnNum(i)));
}
try {
executors.awaitTermination(5, TimeUnit.SECONDS);
} catch (InterruptedException e) {
e.printStackTrace();
}
for (int i = 0; i < printNum.length; i++) {
int num=0;
try {
//take it when there has a result;
num = service.take().get();
//stop when there has no result no matter others having;
// num=fetures.get(i).get();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
System.out.println("num is:"+num);
}
executors.shutdown();
}
static class getCurrnNum implements Callable<Integer>{
private int printNum;
public getCurrnNum(int i) {
printNum=i;
}
@Override
public Integer call() throws Exception {
try {
Thread.sleep(printNum);
} catch (Exception e) {
}
return printNum;
}
}
}
------------------
分享到:
相关推荐
1.继承线程父类,自定义子类 2.子类中重写run方法,@override,里面放你像实现的功能 3.mian()函数中创建子类对象,MyThread my =
这本书对JAVA多线程进阶帮助非常之大而且详细、融会贯通、看了必定打通多线程任督二脉
人工智能-项目实践-多线程-java基础进阶。包括:socket,多线程,反射,servlet,动态代理等高级知识 java基础进阶。包括:socket,多线程,反射,servlet,动态代理等高级知识
来自B站 遇见狂神说
。
。
java进阶提高学习教程-13JVM与多线程
本Java视频教程适合有一定编程语言基础的学员观看,在本Java视频教程中讲解了Java面向对象、异常、数组、常用类、集合、IO流、线程、反射机制。该视频教程基于Java13进行讲解,Java13是目前Java最新版本。视频中讲师...
这套课程既可以作为从零基础开始...课程的主要内容涉及有JAVA基础课程、JAVA多线程与并发编程、数据库开发基础和进阶、Spring Framework、Spring进阶、Spring MVC框架、Spring boot、Java常用类库、Java异常处理等等
Java基础和Java进阶: 1、Junit使用流程 2、集合进阶(一) 3、集合框架(二) 4、Stream流 5、进阶测试 6、IO流 7、算法(部分) 8、多线程 9、网络编程 10、Java高级
多线程(共44页).ppt 推荐优质Java课程 疯狂Java语言编程 Java入门到进阶教程 17.网络编程(共42页).ppt 推荐优质Java课程 疯狂Java语言编程 Java入门到进阶教程 18.类加载与反射(共25页).ppt
共九章内容: 第 1 章 Java概述 第 2 章 Java语言基础 第 3 章 类的封装、继承和多态 第 4 章 接口、内部类和 Java API 基础 ...第 7 章 多线程 第 8 章 Applet 应用程序 第 9 章 输入/输出流和文件操作
java多线程基础知识练习题,选择题及代码题。适合初学者
本专栏主要为Java程序设计(基础)实验报告和Java程序设计(进阶)...进阶篇有反射、泛型、注解、网络编程、多线程、序列化、数据库、Servlet、JSP、XML解析、单例模式与枚举。本专栏主要为Java入门者提供实验参考。
中文名: 编程实践:Java进阶100例 原名: 编程实践:Java进阶100例 别名: Java 作者: 李相国等. 译者: 李相国等. 图书分类: 软件 资源格式: PDF 版本: 影印版 出版社: 李相国等. 书号: 9787111372370. 发行...
山西大学java进阶实验 实验1:代码 实验2:反射 实验3:泛型 实验4:注解 实验5:网络编程 实验6:多线程 实验7:序列化 实验8:数据库 实验9:Servlet 实验10:JSP 实验11:XML解析 实验12:单例模式与枚举
多线程实现案例(多兵种联合攻击防御塔程序),适合java进阶学习。
华师大陈良育老师为您讲解Java进阶课程中的多线程、网络、数据库等等
27天实现java从入门到进阶 第一天:语言环境 第二天:常量变量 第三天:流程控制 第四、五天:方法与数组 第六天:类 第七天:对象的出生 第八天:类与类继承 第九天:具体到抽象的升华 第10天:权限内部类包 第11天...
多线程(共44页).ppt 推荐优质Java课程 疯狂Java语言编程 Java入门到进阶教程 17.网络编程(共42页).ppt 推荐优质Java课程 疯狂Java语言编程 Java入门到进阶教程 18.类加载与反射(共25页).ppt