java吧 关注:1,295,203贴子:12,831,049
  • 2回复贴,共1

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

只看楼主收藏回复

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


1楼2020-01-03 17:58回复
    创建方式一:继承 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 + "毫秒】";
    }
    }
    以上就是关于多线程创建方式面试题的解答


    2楼2020-01-03 17:59
    回复
      2026-01-20 06:28:03
      广告
      不感兴趣
      开通SVIP免广告
      实际开发中多线程的应用场景


      IP属地:上海来自Android客户端3楼2020-01-04 11:52
      回复