美文网首页
线程之创建方式

线程之创建方式

作者: 俗人浮生 | 来源:发表于2019-03-14 20:36 被阅读0次

面试题:线程的创建方式有哪几种?
想都没想就答:有两种,一种是直接继承Thread类,一种是实现Runnable接口
面试官:Any more?
我:这·······

其实,还有一种叫做Callable,看起来跟Runnable有点像,但还是有区别的,我们还是直接上例子吧:

       //第1种Thread
       Thread thread=new Thread(){
            @Override
            public void run() {
                super.run();
                System.out.println("当前线程1:"+Thread.currentThread().getName());
            }
        };
        thread.start();

        //第2种Runnable
        Runnable runnable=new Runnable() {
            @Override
            public void run() {
                System.out.println("当前线程2:"+Thread.currentThread().getName());
            }
        };
        new Thread(runnable).start();

        //第3种Runnable
        Callable<String> callable=new Callable<String>() {
            @Override
            public String call() throws Exception {
                System.out.println("当前线程3:"+Thread.currentThread().getName());
                Thread.sleep(2000);
                return "你好吗?";
            }
        };
        FutureTask<String> futureTask=new FutureTask<>(callable);
        new Thread(futureTask).start();
        try {
            String s = futureTask.get();//阻塞线程,2秒后才返回结果
            System.out.println("输出结果:"+ s);
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        }

前面两种没什么好说的,我们来看看Runnable和Callable的区别:
1、最大的区别:Callable有返回值,Runnable没有返回值
2、Callable中的call方法允许 throws Exception,Runnable中的异常只能自己处理,不能上抛

我们重点来看看Callable,从上面的区别我们可以知道,其实引入了Callable最大的好处就是我们可以获取到线程执行的结果,上面的例子也正好说明这一点。
说到Callable,总免不了要说Future和FutureTask,我们来看看Future的源码:

public interface Future<V> {
    boolean cancel(boolean mayInterruptIfRunning);
    boolean isCancelled();
    boolean isDone();
    V get() throws InterruptedException, ExecutionException;
    V get(long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException;
}

它是一个泛型接口,从它的方法我们可以直接,它提供了3个主要的功能:
1)判断任务是否完成;
2)能够中断任务;
3)能够获取任务执行结果。
而FutureTask是Future接口的一个唯一实现类,所以,我们上面用的就是FutureTask。
需要注意一点,拿上面例子来说吧: String s = futureTask.get(),这一步是阻塞线程的,一直到线程执行完毕返回结果。

相关文章

  • 线程之创建方式

    面试题:线程的创建方式有哪几种?想都没想就答:有两种,一种是直接继承Thread类,一种是实现Runnable接口...

  • 多线程

    # 多线程使用 一、NSThread 1、创建的3种基本使用方式 2、线程之间通信方式 二、GCD 1、核心概念:...

  • iOS开发中的多线程

    1、pthread 2、NSThread(3种创建方式) 创建和启动线程Paste_Image.png 其他创建线...

  • Java多线程:线程的创建与启动

    # 面试题: Java中创建线程有几种方式。 不同的创建方式有什么区别。 如何启动一个线程。 # Java中创建线...

  • ps

    钢笔工具1.创建路径:单机的方式能直接创建直线路径,点击+拖移方式能创建曲线路径线2.按ctrl键可以选择和修改平...

  • 关于声明控件用weak和strong的问题&NSString用c

    1、控件声明strong好还是weak? 以创建一个lable为例,在storyboard里用拖线的方式创建时,系...

  • 3.多线程基础(三)NSThead使用

    1.NSThread创建新线程: 创建线程之后是默认不执行的状态 创建线程设置线程的属性 2.NSThread创建...

  • Java基础—多线程总结

    创建线程的三种方式 1.0 继承Thread类 2.0实现Runnable接口 3.0实现Callable接口 线...

  • javascript面向对象解析(一)

    创建对象的方式 json对象方式创建对象 Object方式 声明构造函数方式,创建对象 -- 这种创建对象的方式用...

  • mysql 存储过程

    创建存储过程之前.... 变量 创建 赋值 >@ @符号标识后面跟的一个变量 创建存储过程 固定格式 设置结束标志...

网友评论

      本文标题:线程之创建方式

      本文链接:https://www.haomeiwen.com/subject/zhfhmqtx.html