多线程创建的三种方式
1.多线程的实现方案一:继承Thread类
创建线程的步骤
-
定义一个子类MyThread继承线程类java.lang.Thread,重写run()方法
-
创建MyThread类的对象
-
调用线程对象的start()方法启动线程(启动后还是执行run方法的)
方法一优缺点:
-
优点:编码简单
-
缺点:线程已经继承Thread,无法继承其他类,不利于扩展
代码实例
1 /* 2 1、定义一个线程类继承Thread类 3 */ 4 public class MyThread extends Thread{ 5 /* 6 2、重写run方法,里面是定义线程以后要干啥 7 */ 8 9 @Override 10 public void run() { 11 for(int i=0; i<5; i++){ 12 System.out.println("子线程执行输出:" + i); 13 } 14 } 15 } 16 17 /* 18 目标:多线程的创建方式一:继承Thread类实现 19 */ 20 public class ThreadDemo1 { 21 public static void main(String[] args){ 22 //3、new一个新线程对象 23 Thread t = new MyThread(); 24 //4、调用start方法启动线程(其实执行的还是run方法) 25 t.start(); //新执行一个线程 26 27 for(int i=0; i<5; i++){ 28 System.out.println("主线程执行输出:" + i); 29 } 30 } 31 }
此代码的运行结果不固定,因为是双线程,打印输出的次序在 t.start() 和 第27行for循环之间,反复横跳(随机执行)。
1.为什么不直接调用run方法,而是调用start启动线程。
-
直接调用run方法会当成方程普通方法执行,此时相当于还是单线程执行。
-
只有调用start方法才是启动一个新的线程执行。
2.把主线程任务放在子线程之前会怎么样?
-
这样主线程一直是先跑完的,相当于是一个单线程的效果了。
2.多线程的实现方案二:实现Runnable接口
创建线程的步骤
-
定义一个线程任务类MyRunnable实现Runnable接口,重写run()方法。
-
创建MyRunnable任务对象。
-
把MyRunnable任务对象交给Thread处理。
-
调用线程对象的start()方法启动线程。
方法一优缺点:
-
优点:线程任务类只是实现了Runnable接口,可以继续继承和实现。
-
缺点:如果线程有执行结果是不能直接返回的。
Thread的构造器
构造器 | 说明 |
public Thread(String name) | 可以为当前线程指定 |
public Thrad(Runnable target) | 封装Runnable对象成为线程对象 |
public Thread(Runnable target, String name) | 封装Runnable对象成为线程对象,并指定线程名称 |
实例代码
1 /** 2 目标:学会线程的创建方式二,理解它的优缺点 3 */ 4 public class ThreadDemo2 { 5 public static void main(String[] args) { 6 //3、创建一个任务对象 7 Runnable target = new MyRunnable(); 8 //4、把任务对象交给Thread处理 9 Thread t = new Thread(target); 10 //5、启动线程 11 t.start(); 12 13 for(int i=0; i<10; i++){ 14 System.out.println("主线程执行输出:" + i); 15 } 16 } 17 } 18 19 20 //1、定义一个线程任务类,实现Runnable接口 21 class MyRunnable implements Runnable{ 22 //2、重写run方法,定义线程的执行任务 23 @Override 24 public void run() { 25 for(int i=0; i<10; i++){ 26 System.out.println("子线程执行输出:" + i); 27 } 28 } 29 }
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性