-
package test;
-
import java.util.Random;
-
import java.util.concurrent.Callable;
-
import java.util.concurrent.ExecutionException;
-
import java.util.concurrent.FutureTask;
-
/**
-
*
-
* @author Administrator
-
*
-
*/
-
@SuppressWarnings(“all”)
-
public class FutureTaskDemo {
-
public static void main(String[] args) {
-
// 初始化一个Callable对象和FutureTask对象
-
Callable pAccount = new PrivateAccount();
-
FutureTask futureTask = new FutureTask(pAccount);
-
// 使用futureTask创建一个线程
-
Thread pAccountThread = new Thread(futureTask);
-
System.out.println(“futureTask线程现在开始启动,启动时间为:” + System.nanoTime());
-
pAccountThread.start();
-
System.out.println(“主线程开始执行其他任务”);
-
// 从其他账户获取总金额
-
int totalMoney = new Random().nextInt(100000);
-
System.out.println(“现在你在其他账户中的总金额为” + totalMoney);
-
System.out.println(“等待私有账户总金额统计完毕…”);
-
// 测试后台的计算线程是否完成,如果未完成则等待
-
while (!futureTask.isDone()) {
-
try {
-
Thread.sleep(500);
-
System.out.println(“私有账户计算未完成继续等待…”);
-
} catch (InterruptedException e) {
-
e.printStackTrace();
-
}
-
}
-
System.out.println(“futureTask线程计算完毕,此时时间为” + System.nanoTime());
-
Integer privateAccountMoney = null;
-
try {
-
privateAccountMoney = (Integer) futureTask.get();
-
} catch (InterruptedException e) {
-
e.printStackTrace();
-
} catch (ExecutionException e) {
-
e.printStackTrace();
-
}
-
System.out.println(“您现在的总金额为:” + totalMoney + privateAccountMoney.intValue());
-
}
-
}
-
@SuppressWarnings(“all”)
-
class PrivateAccount implements Callable {
-
Integer totalMoney;
-
@Override
-
public Object call() throws Exception {
-
Thread.sleep(5000);
-
totalMoney = new Integer(new Random().nextInt(10000));
-
System.out.println(“您当前有” + totalMoney + “在您的私有账户中”);
-
return totalMoney;
-
}
-
}
运行结果
futureTask线程现在开始启动,启动时间为:3098040622063
主线程开始执行其他任务
现在你在其他账户中的总金额为56983
等待私有账户总金额统计完毕…
私有账户计算未完成继续等待…
私有账户计算未完成继续等待…
私有账户计算未完成继续等待…
私有账户计算未完成继续等待…
私有账户计算未完成继续等待…
私有账户计算未完成继续等待…
私有账户计算未完成继续等待…
私有账户计算未完成继续等待…
私有账户计算未完成继续等待…
您当前有3345在您的私有账户中
私有账户计算未完成继续等待…
futureTask线程计算完毕,此时时间为3103072404138
您现在的总金额为:569833345
来源: http://zheng12tian.iteye.com/blog/991484
Example2:
-
public class FutureTaskSample {
-
static FutureTask future = new FutureTask(new Callable(){
-
public String call(){
-
return getPageContent();
-
}
-
});
-
public static void main(String[] args) throws InterruptedException, ExecutionException{
-
//Start a thread to let this thread to do the time exhausting thing
-
new Thread(future).start();
-
//Main thread can do own required thing first
-
doOwnThing();
-
//At the needed time, main thread can get the result
-
System.out.println(future.get());
-
}
-
public static String doOwnThing(){
-
return “Do Own Thing”;
-
}
-
public static String getPageContent(){
-
return “testPageContent and provide that the operation is a time exhausted thing…”;
-
}
-
}
下面是 Callable 和 Runnable的介绍:
编写多线程程序是为了实现多任务的并发执行,从而能够更好地与用户交互。一般有三种方法,Thread,Runnable,Callable.
Runnable和Callable的区别是,
(1)Callable规定的方法是call(),Runnable规定的方法是run().
(2)Callable的任务执行后可返回值,而Runnable的任务是不能返回值得
(3)call方法可以抛出异常,run方法不可以
(4)运行Callable任务可以拿到一个Future对象,表示异步计算的结果。它提供了检查计算是否完成的方法,以等待计算的完成,并检索计算的结果。通过Future对象可以了解任务执行情况,可取消任务的执行,还可获取执行结果。
1、通过实现Runnable接口来创建Thread线程:
步骤1:创建实现Runnable接口的类:
class SomeRunnable implements Runnable
{
public void run()
{
//do something here
}
}
步骤2:创建一个类对象:
Runnable oneRunnable = new SomeRunnable();
步骤3:由Runnable创建一个Thread对象:
Thread oneThread = new Thread(oneRunnable);
步骤4:启动线程:
oneThread.start();
至此,一个线程就创建完成了。
注释:线程的执行流程很简单,当执行代码oneThread.start();时,就会执行oneRunnable对象中的void run();方法,
该方法执行完成后,线程就消亡了。
2、与方法1类似,通过实现Callable接口来创建Thread线程:其中,Callable接口(也只有一个方法)定义如下:
public interface Callable
{
V call() throws Exception;
}
步骤1:创建实现Callable接口的类SomeCallable(略);
步骤2:创建一个类对象:
Callable oneCallable = new SomeCallable();
步骤3:由Callable创建一个FutureTask对象:
分享
这次面试我也做了一些总结,确实还有很多要学的东西。相关面试题也做了整理,可以分享给大家,了解一下面试真题,想进大厂的或者想跳槽的小伙伴不妨好好利用时间来学习。学习的脚步一定不能停止!
Spring Cloud实战
Spring Boot实战
面试题整理(性能优化+微服务+并发编程+开源框架+分布式)
加入社区:https://bbs.csdn.net/forums/4304bb5a486d4c3ab8389e65ecb71ac0
teger>对象:
分享
这次面试我也做了一些总结,确实还有很多要学的东西。相关面试题也做了整理,可以分享给大家,了解一下面试真题,想进大厂的或者想跳槽的小伙伴不妨好好利用时间来学习。学习的脚步一定不能停止!
[外链图片转存中…(img-qx49cjCu-1725482923636)]
Spring Cloud实战
[外链图片转存中…(img-TgboHuqT-1725482923636)]
Spring Boot实战
[外链图片转存中…(img-Oqz9Em5E-1725482923637)]
面试题整理(性能优化+微服务+并发编程+开源框架+分布式)
加入社区:https://bbs.csdn.net/forums/4304bb5a486d4c3ab8389e65ecb71ac0