程序员求职经验分享与学习资料整理平台

网站首页 > 文章精选 正文

大厂高频面试:创建线程的三种方式及其区别和联系

balukai 2024-12-27 11:56:41 文章精选 8 ℃

如果你想进大厂,线程,线程池的应用,你一定要非常熟悉。今天我们先来谈一谈线程的三种创建方式及其区别和联系。

创建线程的三种方式

第一种:通过继承Thread;第二种 :通过实现Runnable接口;第三种:通过实现Callable接口

package com;

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;

/**
 * 创建线程的三种方式
 */
public class Test {
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        //第一种 继承Thread类
        MyThread1 myThread1 = new MyThread1();
        myThread1.start();

        //第二种 实现Runnable接口
        MyTask myTask = new MyTask();
        Thread myThread2 = new Thread(myTask);
        myThread2.start();

        //第三种 实现Callable接口
        MyTaskByCallable myTaskByCallable = new MyTaskByCallable();
        FutureTask<Integer> futureTask = new FutureTask<Integer>(myTaskByCallable);
        Thread myThread3 = new Thread(futureTask);
        myThread3.start();
        Integer result = futureTask.get();
        System.out.println(result);
    }
}

class MyThread1 extends Thread {
    @Override
    public void run() {
        System.out.println(Thread.currentThread().getName() + ": 通过继承Thread类的方式创建线程。。。");
    }
}

class MyTask implements Runnable {
    @Override
    public void run() {
        System.out.println(Thread.currentThread().getName() + ": 通过实现Runnable接口的方式创建线程。。。");
    }
}

class MyTaskByCallable implements Callable<Integer> {
    @Override
    public Integer call() throws Exception {
        System.out.println(Thread.currentThread().getName() + ": 通过实现Callable接口的方式创建线程。。。");
        return 1;
    }
}

运行结果:

Thread-0: 通过继承Thread类的方式创建线程。。。
Thread-1: 通过实现Runnable接口的方式创建线程。。。
Thread-2: 通过实现Callable接口的方式创建线程。。。
1

区别

1.第一种是通过继承的方式,另外两种都是通过实现接口的方式

2.第二种和第三种的区别在于:实现Callable接口的方式可以在线程执行结束后获取结果,而通过实现Runnable接口的方式不能返回结果。

3.开发过程中,我们一般会选择通过实现接口的方式创建线程,原因有下面两点:第一,实现的方式没有类的单继承性的局限性;第二,实现的方式更适合来处理多个线程的有共享数据的情况

联系

三种方式都需要重写run()方法,将线程要执行的逻辑声明在run()方法中。

感谢大家的阅读,喜欢的话,点个赞吧,么么哒。

Tags:

最近发表
标签列表