java开启一个线程_【jdk源码分析】java多线程开启的三种方式

本文详细介绍了Java中创建线程的三种方法:1) 继承Thread类并重写run()方法;2) 实现Runnable接口并传入Thread构造器;3) 实现Callable接口与FutureTask结合使用。每种方式都通过实例代码展示了如何启动线程,并分析了其内部执行流程。
摘要由CSDN通过智能技术生成

1、继承Thread类,新建一个当前类对象,并且运行其start()方法

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

1 packagecom.xiaostudy.thread;2

3 /**

4 * @desc 第一种开启线程的方式5 *@authorxiaostudy6 *7 */

8 public class Demo1_Thread extendsThread {9

10 public voidrun() {11 for (int i = 0; i < 10; i++) {12 System.out.println(i + " run()...");13 }14 }15

16 public static voidmain(String[] args) {17 Demo1_Thread demo = newDemo1_Thread();18 demo.start();19 for (int i = 0; i < 10; i++) {20 System.out.println(i + " main()...");21 }22 }23

24 }

Demo1_Thread.java

07ab04419215198e8a4a3b7c3f921871.png

上面这里就是当前类的一个线程和main线程一起运行

2、实现Runnable接口,然后新建当前类对象,接着新建Thread对象时把当前类对象传进去,最后运行Thread对象的start()方法

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

1 packagecom.xiaostudy.thread;2

3 /**

4 * @desc 第二种开启线程的方式5 *@authorxiaostudy6 *7 */

8 public class Demo2_Thread implementsRunnable {9

10 public voidrun() {11 for (int i = 0; i < 10; i++) {12 System.out.println(i + " run()...");13 }14 }15

16 public static voidmain(String[] args) {17 Demo2_Thread demo = newDemo2_Thread();18 Thread thread = newThread(demo);19 thread.start();20 for (int i = 0; i < 10; i++) {21 System.out.println(i + " main()...");22 }23 }24

25 }

Demo2_Thread.java

9bb9b8452c54eae5b6f060ea41186316.png

分析:

从Thread的有参构造方法进去

9b28f1dbd088dd1623edf87ebbcdd87e.png

当前类传进去,进入到Thread的init()方法

69432e794cfa8f86fa4faa36e23b9652.png

再跟进去

5b1227a2602f60a3513cea277c44b902.png

下面截图问题,分开两个,看行号。就把当前类赋值给了Thread的target属性

d919de3b33797254be03a7d25b40d916.png

3407eeb5200e8cfd18df176aed734080.png

再回过头来看Thread对象的run()方法,因为当Thread对象的start()方法调用时,是执行Thread对象的run()方法(这里就不深入分析)

a4799495b430548a27d26de2579bc382.png

这里的target的值就是当前类对象,所以最后还是执行了当前类对象的run()方法

d916fb0451374408bc97d2ce96630fa5.png

3、实现Callable接口,新建当前类对象,在新建FutureTask类对象时传入当前类对象,接着新建Thread类对象时传入FutureTask类对象,最后运行Thread对象的start()方法

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

packagecom.xiaostudy.thread;importjava.util.concurrent.Callable;importjava.util.concurrent.FutureTask;/*** @desc 第三种开启线程的方式

*@authorxiaostudy

**/

public class Demo3_Thread implementsCallable {public static voidmain(String[] args) {

Callable callable= newDemo3_Thread();

FutureTask futureTask= newFutureTask(callable);

Thread thread= newThread(futureTask);

thread.start();for (int i = 0; i < 10; i++) {

System.out.println(i+ " main()...");

}

}public Object call() throwsException {for (int i = 0; i < 10; i++) {

System.out.println(i+ " call()...");

}return null;

}

}

Demo3_Thread.java

1d625b86a47cbe97b352c43eb4946105.png

分析:

同样从Thread的有参构造方法进去

7c3775eb9d5fe41faf541827a903d3f8.png

同样也是跟第二种方法一样

cdb18bb30c44b931da58862585e011f6.png

那么,就看Runnable接口和FutureTask类的关系。从下面的图看出FutureTask类是Runnable接口的继承接口的实现类。

288b78117a6521f0b58d3d8c2bf1cba9.png

接着看看FutureTask的有参构造

f3d4fa5d4665e5b0f1653ee064b1ac90.png

从下图可以看出,FutureTask的有参构造,把当前类对象传给了FutureTask的callable属性

7f1cabf8e2b13ce14b8b2bc1ff36a381.png

那么当Thread执行start()方法时,就是执行FutureTask的run()方法,从下面图看到,最后就是执行了当前类的call()方法

3f2afa298b78c5a99da25ada381ac572.png

1b6615e795096f2d07777e5522be3b25.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值