• 在线客服

  • 扫描二维码
    下载博学谷APP

  • 扫描二维码
    关注博学谷微信公众号

  • 意见反馈

原创 关于多线程创建方式面试题的解答

发布时间:2020-01-03 11:15:09 浏览 3755 来源:博学谷 作者:照照

    多线程Java学习中不可绕过的一个重要知识点,相信大家对于多线程的定义已经很清晰了。一般来讲,我们说的多线程是指这个程序运行时,产生了不止一个线程。对于多线程的创建方式一直也是Java面试中的重点,本文就来为大家详细解答一下关于多线程创建方式的疑问,感兴趣的小伙伴现在赶紧来一起看看吧!
      

    多线程创建方式面试题

     

    创建方式一:继承 Thread 类:

     

    但 Thread 本质上也是实现了 Runnable 接口的一个实例,它代表一个线程的实例,并且,启动线程的唯一方法就是通过 Thread 类的 start()实例方法。start()方法是一个 native 方法,它将启动一个新线程,并执行 run()方法。这种方式实现多线程很简单,通过自己的类直接 extend Thread,并复写 run()方法,就可以启动新线程并执行自己定义的 run()方法。例如:继承 Thread 类实现多线程,并在合适的地方启动线程。
      

    public class MyThread extends Thread {
      

    public void run() {
      

    System.out.println("MyThread.run()");
      

    }
      

    }
      

    MyThread myThread1 = new MyThread(); 7.MyThread myThread2 = new MyThread(); myThread1.start();
      

    myThread2.start();
      

    创建方式二:实现 Runnable 接口的方式实现多线程,并且实例化 Thread,传入自己的Thread 实例,调用 run( )方法
      

    public class MyThread implements Runnable
      

    public void run() {
      

    System.out.println("MyThread.run()");
      

    }
      

    }
      

    MyThread myThread = new MyThread();
      

    Thread thread = new Thread(myThread);
      

    thread.start();
      

    创建方式三:使用 ExecutorService、Callable、Future 实现有返回结果的多线程:ExecutorService、Callable、Future 这 个 对 象 实 际 上 都 是 属 于 Executor 框 架 中 的 功 能 类 。
      

    下面提供了一个完整的有返回结果的多线程测试例子,在JDK1.5 下验证过没问题可以直接使用。代码如下:
      

    import java.util.concurrent.*;
      

    import java.util.Date;
      

    import java.util.List;
      

    import java.util.ArrayList;
      

    /**
      

    * 有返回值的线程
      

    */
      

    @SuppressWarnings("unchecked")

     

    public class Test {
      

    public static void main(String[] args) throws ExecutionException,

     

    InterruptedException {
      

    System.out.println("----程序开始运行----");

     

    Date date1 = new Date();

     

    int taskSize = 5;

     

    // 创建一个线程池
      

    ExecutorService pool = Executors.newFixedThreadPool(taskSize);

     

    // 创建多个有返回值的任务
     

    List<Future> list = new ArrayList<Future>();

     

    for (int i = 0; i < taskSize; i++) {

     

    Callable c = new MyCallable(i + " ");

     

    // 执行任务并获取 Future 对象
      

    Future f = pool.submit(c);
      

    // System.out.println(">>>" + f.get().toString());

     

    list.add(f);
      

    }
     

    // 关闭线程池
     

    pool.shutdown();
      

    // 获取所有并发任务的运行结果
      

    for (Future f : list) {
      

    // 从 Future 对象上获取任务的返回值,并输出到控制台

     

    System.out.println(">>>" + f.get().toString());

     

    }
     

    Date date2 = new Date();
      

    System.out.println("----程序结束运行----,程序运行时间【"

     

    + (date2.getTime() - date1.getTime()) + "毫秒】");

     

    }
      

    }
     

    class MyCallable implements Callable<Object> {

     

    private String taskNum;
      

    MyCallable(String taskNum) {

     

    this.taskNum = taskNum;

     

    }
     

    public Object call() throws Exception {
      

    System.out.println(">>>" + taskNum + "任务启动");
      

    Date dateTmp1 = new Date(); 53.Thread.sleep(1000);
      

    Date dateTmp2 = new Date();
     

    long time = dateTmp2.getTime() - dateTmp1.getTime(); 56.System.out.println(">>>" + taskNum + "任务终止");
      

    return taskNum + "任务返回运行结果,当前任务时间【" + time + "毫秒】";

     

    }
     

    }

     

    以上就是关于多线程创建方式面试题的解答,大家都看明白了吗?希望本文能够解决大家对于多线程的一些疑问,关于Java中的多线程的更多面试题,大家可以在Java的就业班的课程中进行更加详细的学习。

    申请免费试学名额    

在职想转行提升,担心学不会?根据个人情况规划学习路线,闯关式自适应学习模式保证学习效果
讲师一对一辅导,在线答疑解惑,指导就业!

上一篇: 零基础学Java难吗?需要学多长时间? 下一篇: Java培训班在线教育怎么样?零基础能学好吗?

相关推荐 更多

热门文章

  • 前端是什么
  • 前端开发的工作职责
  • 前端开发需要会什么?先掌握这三大核心关键技术
  • 前端开发的工作方向有哪些?
  • 简历加分-4步写出HR想要的简历
  • 程序员如何突击面试?两大招带你拿下面试官
  • 程序员面试技巧
  • 架构师的厉害之处竟然是这……
  • 架构师书籍推荐
  • 懂了这些,才能成为架构师
  • 查看更多

扫描二维码,了解更多信息

博学谷二维码