温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

Java中Runnable与Callable接口有什么区别

发布时间:2023-03-28 15:26:22 来源:亿速云 阅读:98 作者:iii 栏目:开发技术

这篇文章主要介绍“Java中Runnable与Callable接口有什么区别”,在日常操作中,相信很多人在Java中Runnable与Callable接口有什么区别问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java中Runnable与Callable接口有什么区别”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

预备知识

Java中的线程对象是Thread,新建线程也只有通过创建Thread对象的实例来创建。

先说结论

1 Runnable没有返回值的FunctionalInterface(jdk 1.8概念)接口,相反Callable是有返回值的FunctionalInterface接口

2 Runnable + Thread 创建一个无返回结果的任务线程

3 Runnable + Callable +Thread 创建一个有返回结果的任务线程

一:Runnable 示例

创建一个无返回结果的任务线程,so eazy !!!!

public static void main(String[] args) {
        new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println(Thread.currentThread().getName() + "我是一个无返回结果的任务线程");
            }
        },"线程一:").start(); //start()开启任务
    }

二:Callable示例

2.1 JAVA异步编程之Callbacks与Futures模型 

我是用Executors线程池的方式来创建的。

2.2 用最原始的方法

public class PrimitiveCallable implements Callable, Runnable {
    
    public static void main(String[] args) {
        //实现
        new Thread(new PrimitiveCallable(), "线程二:").start();
    }
    @Override
    public void run() {//Runnable实现
        try {
            Object call = this.call();
            System.out.println(call);
        } catch (Exception exception) {
            exception.printStackTrace();
        }
    }
    @Override
    public Object call() throws Exception { //Callable 实现
        return "异步任务返回的结果!!!";
    }
}

2.3 FutureTask 一种jdk的实现方式

public class FutureTask<V> implements RunnableFuture<V> { //RunnableFuture 实现了以上2个接口
    ........省略.........
	public void run() { //重写run实现
        if (state != NEW ||
            !UNSAFE.compareAndSwapObject(this, runnerOffset,
                                         null, Thread.currentThread()))
            return;
        try {
            Callable<V> c = callable; //构建对象是传入的参数
            if (c != null && state == NEW) {
                V result;
                boolean ran;
                try {
                    result = c.call(); //调用任务并返回结果
                    ran = true;
                } catch (Throwable ex) {
                    result = null;
                    ran = false;
                    setException(ex); //设置异常时的结果
                }
                if (ran)
                    set(result); //设置结果
            }
        } finally {
            runner = null;
            int s = state;
            if (s >= INTERRUPTING)
                handlePossibleCancellationInterrupt(s);
        }
    }
     ........省略.........
}

小结

1 不要纠结有几种创建线程的方法了,就一种即通过Thread,但Thread有9个构造函数方法

2 9个构造函数方法

 public Thread()
 public Thread(Runnable target)
 Thread(Runnable target, AccessControlContext acc)
 public Thread(ThreadGroup group, Runnable target)
 public Thread(String name)
 public Thread(ThreadGroup group, String name)
 public Thread(Runnable target, String name)
 public Thread(ThreadGroup group, Runnable target, String name)
 public Thread(ThreadGroup group, Runnable target, String name,
                  long stackSize)

到此,关于“Java中Runnable与Callable接口有什么区别”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注亿速云网站,小编会继续努力为大家带来更多实用的文章!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI