多线程创建的三种方式

1.多线程的实现方案一:继承Thread类

创建线程的步骤

  1. 定义一个子类MyThread继承线程类java.lang.Thread,重写run()方法

  2. 创建MyThread类的对象

  3. 调用线程对象的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接口

创建线程的步骤

  1. 定义一个线程任务类MyRunnable实现Runnable接口,重写run()方法。

  2. 创建MyRunnable任务对象。

  3. 把MyRunnable任务对象交给Thread处理。

  4. 调用线程对象的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 }
复制代码

 

posted @   白森  阅读(394)  评论(0编辑  收藏  举报
编辑推荐:
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
阅读排行:
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
点击右上角即可分享
微信分享提示