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多线程]线程创建的三种方式,线程的互斥,线程的同步