Java创建线程的6种方式

Posted 爱敲代码的三毛

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java创建线程的6种方式相关的知识,希望对你有一定的参考价值。

在Java中使用Thread这个类来创建线程,通过这个类有很多方法来创建线程

1. 继承Thread重写run方法

class MyThread extends Thread 
	@Override
	public void run() 
		System.out.println("继承Thread,重写run方法");
	

2.实现Runnable接口,重写run方法

class MyThread implements Runnable 
	@Override
	public void run() 
		System.out.println("实现Runnable接口,重写run方法")
	

3.继承Thread,重写run方法使用匿名内部类

class MyThread implements Runnable 
	@Override
	public void run() 
		System.out.println("实现Runnable接口,")
	

4.实现Runnable接口,重写run方法,使用匿名内部类

public static void main(String[] args) 
    Thread t = new Thread(new Runnable() 
        @Override
        public void run() 
            System.out.println("实现Runnable 接口,使用匿名内部类创建");
        
    );

5.使用lambda表达式

public static void main(String[] args) 
    Thread t = new Thread(()->
        System.out.println("使用 lambda 表达式来创建 Runnable 子类对象")
    );

6.使用Callable接口

Runnable只是描述了一个过程,不关注结果(返回值)

Callable也是描述了一个过程,同时要关注结果(泛型参数就是返回值)
Callable中包含了 call() 方法,和Runnable的run()方法类似,都是描述一个具体任务,不过call()方法是带返回值的
如果期望创建一个线程,并关注这个线程产生的放回结果,使用Callable比较合适
通过FutureTask的get()方法来获取Callable的返回值,如果此时还有返回值,get方法就会阻塞

列如创建一个线程计算1~1000的和

public static void main(String[] args) throws ExecutionException, InterruptedException 
        //这是一个能有返回值的线程,也是一个接口
        Callable<Integer> callable = new Callable<Integer>() 
            @Override
            public Integer call() throws Exception 
                //Thread.sleep(4000);
                int sum = 0;
                for (int i = 0; i <= 1000; i++) 
                    sum+=i;
                
                return sum;
            
        ;
        //通过 FutureTask 来接收 Callable的返回值
        FutureTask<Integer> futureTask = new FutureTask<>(callable);
        Thread t = new Thread(futureTask);
        //调用t.start() 就会执行 FutureTask() 内部的 call 方法,完成计算,计算结果就会返回到 FutureTask对象中
        t.start();
        System.out.println("hhh");
        //调用FutureTask的 get 方法就能获取到结果
        //如果FutureTask没有接受到值就会阻塞等待
        int tmp = futureTask.get();
        System.out.println(tmp);

以上这些创建线程的方式本质都相同,都是借助 Thread 类,在内核中创建新的PCB,加入到内核的双向链表中。只不过区别是,指定线程要执行任务的方式不一样,此处的区别,其实都只是单纯的Java语法层面的区别

以上是关于Java创建线程的6种方式的主要内容,如果未能解决你的问题,请参考以下文章

[Java多线程]线程创建的三种方式,线程的互斥

[Java多线程]线程创建的三种方式,线程的互斥,线程的同步

创建线程的6种方式,用Lambda表达式你绝对没用过

[Java多线程]线程创建的三种方式,线程的互斥,线程的同步

java中线程的两种创建方式

java线程的6种状态以及相互转换