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

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


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

进程是程序的一次执行过程,是资源分配的最小单位
线程是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.使用线程池创建

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

  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值