为什么学Callable
首先,我们今天要讲的就是线程,在线程中呢,我们创建一个线程,很简单,无非就是创建一个new Thread(),然后进行相应的做法。
Thread thread=new Thread(new Runnable() {
@Override
public void run() {
System.out.println("这是一个线程");
}
});
thread.start();
这里面就是用的Runnable就是的创建线程的方法,来运行,但是,存在一个问题,那就是Runnable方法里面不能返回值,那么假如我在做电商项目的时候,遇到这样的问题,当有几十上百个线程在进行的时候,当有一个线程出现了问题的话,该怎么来进行判断是哪一个线程出错呢,因为都没有返回值,所以,这个时候我们就引入了Callable接口,因为它的方法里面可以进行返回,并且只要你进行FutureTask.get()就可以进行一个输出。
如何使用Callable,使得与FutureTask关联
package Easy.Day7;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;
import java.util.concurrent.TimeUnit;
class CallDemo implements Callable<Integer> {
@Override
public Integer call() throws Exception {
System.out.println("come in callable");//也就是说,这个方法名的前面可以进行的设置就是String字符串进行的表示
try{
TimeUnit.SECONDS.sleep(10);}catch (InterruptedException e) {
e.printStackTrace();
}
return 1024;//这个只要是标记住了方法前有修饰符的,就一定要进行返回
}
}
public class CallableDemo {
public static void main(String[] args) throws InterruptedException, ExecutionException {
CallDemo callDemo=new CallDemo();
FutureTask<Integer> futureTask=new FutureTask<>(new CallDemo());
new Thread(futureTask,"AA").start();
new Thread(new Runnable() {
@Override
public void run() {
System.out.println(" 我 哎 你 ");
}
},"BB").start();
int result0=futureTask.get();
System.out.println(Thread.currentThread().getName()+"********");
int result1=100;
System.out.println(result1);
System.out.println(result0);
}
}
运行之后的结果为:
这个时候我们可以发现的就是Runnable接口中的方法明明是在Callable接口方法的后面的,但是为什么其可以执行在前面,也就是在这里面利用到了Callable的异步的特点,无论你怎么运行,都不会阻塞其他线程的正常运行,这就是Callable的使用特点,在这里,FutureTask代表的就是未来任务的一个特点,好比就是我现在上台了,北京就再也不会堵车的一个情况!哈哈,开玩笑啦
作用
也就是,当我们在处理一个会运行很久的线程的时候,这个时候我们使用Callable的话就不用去考虑阻塞的问题,其他线程不会去等待这个带有Callable的线程。
但是,当我还想用到重复一下这个操作,也就是如下图所示的操作,会发生什么情况呢?
最后也就还是只运行了一次,也就是不会运动到其他地方去。
总结
明怀我最近也是开始边准备项目,边准备面试的一些东西,大家如果觉得文章对你有帮助的话,不妨多看几眼,如果觉得写得还算马马虎虎中规中矩的话,不妨来个点赞也是可以的,你们的阅读就是我写作最大的东西,谢谢大家,一起加油吧~