创建线程的几种方式---最全面的创建线程方式总结---线程创建方式面试看这篇就够了

1年前 (2022) 程序员胖胖胖虎阿
275 0 0

前言:我相信创建线程的方式对于所有的java开发程序员来说都不陌生,在面试过程中这个问题也是高频考点。鉴于此,小编用本篇博文来整理几种线程的创建方式,希望对同学们有所帮助~

文章目录

  • 一、什么是进程?线程和进程有什么关系?
  • 二、线程如何创建?有几种方式?
    • 1.继承Thread类
    • 2.实现Runable接口
    • 3.实现Callable接口结合FutureTask
    • 4.使用lambda表达式
    • 5.使用线程池创建

一、什么是进程?线程和进程有什么关系?

进程是程序的一次执行过程,是资源分配的最小单位
线程是CPU调度的最小单位
线程是进程的一部分
一个线程只能属于一个进程,而一个进程可以有多个线程,但至少有一个线程

二、线程如何创建?有几种方式?

线程的创建有很多种方式,总结下来分为以下几种

1.继承Thread类

/**
 * 创建线程的第一种方式:继承Thread类
 */
public class MyThread01 extends Thread{
    @Override
    public void run() {
            System.out.println(Thread.currentThread().getName() + "正在运行");
    }

    public static void main(String[] args) {
       MyThread01 myThread01 = new MyThread01();
        myThread01.start();
   		System.out.println(Thread.currentThread().getName() + "正在运行");
    }
}

2.实现Runable接口

需要注意的是,当使用实现Runnable接口的方式创建的线程在线程启动的时候不能直接用实现Runnable接口的实现类调start()方法,而是要当做参数传入Thread类实例,然后调用start()方法进行线程启动,原因就是下面这个Runnable接口的实现类MyThread02 不是线程类。

/**
 * 创建线程的第二种方式:实现Runnable接口
 */
public class MyThread02 implements Runnable{
    @Override
    public void run() {
            System.out.println(Thread.currentThread().getName() + "正在运行");
    }

    public static void main(String[] args) {
        MyThread02 myThread02 = new MyThread02();
        Thread thread = new Thread(myThread02);
        thread.start();
        System.out.println(Thread.currentThread().getName() + "正在运行");
    }
}

小知识:其实我们的第一种方式中继承的Thread类在源码中也是实现了Runnable接口哟~

3.实现Callable接口结合FutureTask

这种创建线程的方式在实际工作中不用常用,所以在面试过程中也很少有遇到,但是了解一些也是加分项哟。 FutureTask是一个实现Runnable接口的类,FutureTask内部有一个成员变量将callable接口的返回值保存起来,并通过提供get方法获取。

/**
 * 创建线程的第三种方式:实现Callable接口,结合FutureTask
 */
public class MyThread03 implements Callable<String> {
    @Override
    public String call() throws Exception {
        System.out.println(Thread.currentThread().getName() + "正在运行");
        return "call() 执行完毕";
    }

    public static void main(String[] args) throws ExecutionException, InterruptedException {
        FutureTask<String> futureTask = new FutureTask<>(new MyThread03());
        Thread thread3 = new Thread(futureTask);
        thread3.start();
        System.out.println(Thread.currentThread().getName() + futureTask.get());
    }
}

4.使用lambda表达式

/**
 * 创建线程的第四种方式:使用Lambda表达式
 */
public class MyThread04 {
    public static void main(String[] args) {
        Thread thread = new Thread(() ->{
            System.out.println(Thread.currentThread().getName() + "正在运行");
        });
        thread.start();
    }
}

当然也可以简写为这样:

/**
 * 创建线程的第四种方式:使用Lambda表达式
 */
public class MyThread04 {
    public static void main(String[] args) {
        new Thread(() ->{
            System.out.println(Thread.currentThread().getName() + "正在运行");
        }).start();
    }
}

5.使用线程池创建

这种方式其实是实际工作中使用的最多的一种方式,但同时也是大家在面试回答过程中很容易遗漏的。由于这块东西比较多,小编决定后续单独出一篇文章就行补充总结,敬请期待~

相关文章

暂无评论

暂无评论...