java笔记--用ThreadLocal管理线程,Callable<V>接口实现有返回值的线程
用ThreadLocal管理线程,Callable<V>接口实现有返回值的线程
ThreadLocal在我的笔记"关于线程同步"的第5种方式里面有介绍,这里就不多说了。
--如果朋友您想转载本文章请注明转载地址"http://www.cnblogs.com/XHJT/p/3899890.html "谢谢--
Callable<V>接口类似于Runnable,两者都是为了哪些其实例可能被另一个线程执行的类设计的,
但是Runnable不会返回结果,并且无法抛出异常。
在实现此接口的时候,需要重写call()方法:
V call() throws Exception
在本次实例代码中还用到Future<V>接口
Future<V>接口表示异步计算的结果。它提供了检查计算是否完成的方法,以等待计算的完成,
并获取计算的结果。计算完成后只能使用get()方法来获取结果,如有必要计算完成前可以阻塞此方法。
取消则由cancel方法来执行。
实现此接口需要重写get()方法:
V get() throws InterruptedException,ExecutionException
代码实例:
还是线程同步里面的那个存钱的例子,在这里实现异步计算和线程返回值
package com.xhj.thread; import java.util.concurrent.Callable;
import java.util.concurrent.FutureTask; /**
* Runnable接口实现的线程是没有返回值,本实例将运用Callable<V>接口实现一个有返回值的线程应用
*
* @author XIEHEJUN
*
*/
public class ReturnValuesToThread {
private int a = 1; class Bank { private int account = 100; public int getAccount() {
return account;
} /**
* 存钱
*
* @param money
*/
public void save(int money) {
account += money;
} } private class Transfer implements Callable<Integer> {
private Bank bank; public Transfer(Bank bank) {
this.bank = bank; } /**
* 重写call()方法,并执行一个线程
*/
@Override
public Integer call() throws Exception {
int flag = a++;
System.out.println("启动线程" + flag);
for (int i = 0; i < 10; i++) {
bank.save(10);
System.out.println("账户的余额为:" + bank.getAccount());
}
return bank.getAccount();
}
} /**
* 建立线程,调用内部类,开始存钱
*/
public void useThread() {
/*
* 这里属于异步操作,故要建立两个Bank对象,倘若只建立一个对象则是对同一个资源进行同步操作,
* 那么第二线程将会在第一个线程操作完,并释放资源之后才会执行,
* 但是此时第二个线程得到的本金将不再是最开始初始化的本金而是第一个线程完成操作之后返回的值,而最后的实际金额就是第二个线程的计算结果
*/
Bank bank1 = new Bank();
Bank bank2 = new Bank();
Transfer transfer1 = new Transfer(bank1);
Transfer transfer2 = new Transfer(bank2);
FutureTask<Integer> task1 = new FutureTask<Integer>(transfer1);
FutureTask<Integer> task2 = new FutureTask<Integer>(transfer2);
Thread thread1 = new Thread(task1);
Thread thread2 = new Thread(task2);
thread1.start();
thread2.start();
try {
int threadResult1 = task1.get();
int threadResult2 = task2.get();
System.out.println("一号线程的计算结果是 --" + threadResult1);
System.out.println("二号线程的计算结果是 --" + threadResult2);
int sum = threadResult1 + threadResult2;
int count = sum - 100;
System.out.println("实际金额是 --" + count
+ " (一号线程的计算结果加上二号线程的计算结果再减去100的本金)");
} catch (Exception e) {
System.out.println(e.getMessage());
}
} public static void main(String[] args) {
ReturnValuesToThread rethread = new ReturnValuesToThread();
rethread.useThread(); } }
注:在处理有返回值的线程的时候,要记得捕获异常
java笔记--用ThreadLocal管理线程,Callable<V>接口实现有返回值的线程的更多相关文章
- Java面向对象(Eclipse高级、类与接口作为参数返回值)
面向对象 今日内容介绍 u Eclipse常用快捷键操作 u Eclipse文档注释导出帮助文档 u Eclipse项目的jar包导出与使用jar包 u 不同修饰符混合使用细节 u 辨析何时定义变 ...
- Java线程:线程安全类和Callable与Future(有返回值的线程)
一.线程安全类 当一个类已经很好的同步以保护它的数据时,这个类就称为线程安全的.当一个集合是安全的,有两个线程在操作同一个集合对象,当第一个线程查询集合非空后,删除集合中所有元素的时候,第二个线程也来 ...
- Callable接口--有返回值的线程
Callable java5之前是没有返回值的,Java5新增了Callable接口获得线程的返回值,可返回值的任务必须实现Callable接口,类似的,无返回值的任务必须Runnable接口.Cal ...
- Java线程:新特征-有返回值的线程
http://lavasoft.blog.51cto.com/62575/222082/ Java线程:新特征-有返回值的线程 2009-11-04 17:33:56 标签:返回值 职场 线程 休闲 ...
- Java中使用有返回值的线程
在创建多线程程序的时候,我们常实现Runnable接口,Runnable没有返回值,要想获得返回值,Java5提供了一个新的接口Callable,可以获取线程中的返回值,但是获取线程的返回值的时候,需 ...
- Java线程:新特征-有返回值的线程《转》
原始文章 在Java5之前,线程是没有返回值的,常常为了“有”返回值,破费周折,而且代码很不好写.或者干脆绕过这道坎,走别的路了. 现在Java终于有可返回值的任务(也可以叫做线程)了. ...
- 工作随笔——Java调用Groovy类的方法、传递参数和获取返回值
接触Groovy也快一年了,一直在尝试怎么将Groovy引用到日常工作中来.最近在做一个功能的时候,花了点时间重新看了下Java怎么调用Groovy的方法.传递参数和获取返回值. 示例Groovy代码 ...
- Java线程中带有返回值的线程Callable
在Java5之前,线程是没有返回值的,常常为了“有”返回值,破费周折,而且代码很不好写.或者干脆绕过这道坎,走别的路了.现在Java终于有可返回值的任务(也可以叫做线程)了. 可返回值的任务必须实现C ...
- Java Callable接口——有返回值的线程
实际开发过程中,我们常常需要等待一批线程都返回结果后,才能继续执行.<线程等待——CountDownLatch使用>中我们介绍了CountDownLatch的使用,通过使用CountDow ...
随机推荐
- setTimeout 0秒
我们通常知道常用setTimeout 0秒来解决动画或者一些效果的延迟问题:众所周知js是单线程,用0秒能把要执行的任务从队列中提出来.其实我也不太懂 有这个问题alert(1);setTimeout ...
- [BZOJ 1297][SCOI 2009]迷路(矩阵快速幂)
题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=1297 分析:如果每条边的边权都是1,那么就相当于对邻接矩阵自乘T次(因为写一下递推式子 ...
- C#基础知识系列九(对IEnumerable和IEnumerator接口的糊涂认识)
前言 IEnumerable.IEnumerator到现在为止对这两个接口还是不太理解,不理解但是自己总是想着试着要搞明白,毕竟自己用的少,所以在此先记录一下.以备自己日后可以来翻查,同时也希望园子里 ...
- 第二十课:js中如何操作元素的属性系统
本章的内容有点复杂,我将用简单的方式来介绍重要的东西,不重要的东西,这里就不讲了,讲了也毛用. 通常我们把对象的非函数成员叫做属性.对元素节点来说,其属性大题分为两大类,固有属性和自定义属性.固有属性 ...
- Future模式
Future模式简介 Future模式有点类似于网上购物,在你购买商品,订单生效之后,你可以去做自己的事情,等待商家通过快递给你送货上门.Future模式就是,当某一程序提交请求,期望得到一个答复.但 ...
- java中的字符串简介,字符串的优化以及如何高效率的使用字符串
简介 String最为java中最重要的数据类型.字符串是软件开发中最重要的对象之一,通常,字符串对象在内存中总是占据着最大的空间块.所以,高效处理字符串,将提高系统的整个性能. 在java语言中,S ...
- oracle-2中commit 详解
博文转自:http://blog.csdn.net/hzhsan/article/details/9719307 它执行的时候,你不会有什么感觉.commit在数据库编程的时候很常用,当你执行DML操 ...
- iOS开发小技巧--初始化项目中修改APP安装后的名称
- poj3468 splay(成段跟新 区间求和)
用splay做了一遍. 建树时是按照数列序号从小到大排好的,每个节点左子树的序号小于右子树的序号及这个节点本身.由于查询[l,r]要伸展l-1,r+1所以我们要多加2个结点,保证边界处理时不出问题.由 ...
- 重写UIPageControl实现自定义按钮
有时候UIPageControl需要用到白色的背景, 那么会导致上面的点按钮看不见或不清楚,我们可以通过继承该类重写函数来更换点按钮的图片现实.实现思路如下.新建类继承UIPageControl : ...