Java----线程----01----线程的两种创建方式+后台线程

进程

我们先来看这,打开任务管理器,就可以看到很多进程
在这里插入图片描述这些进程看似是并行执行的,列如我们可以一边听音乐一边看视频,其实这些是并发执行的,即这些进程并不是同时执行的。对于Cpu来说,在某个时间点只能执行一个进程,操作系统为每个进程分配执行的时间,一个进程执行完后就会立刻进行到下一个进程的工作中去。

什么是线程?

在一个进程中可以有多个执行单元同时运行,这些执行单元可以看做一条条线索,这些线索就是线程,操作系统中每个进程都至少存在一个线程,当一个Java程序启动时,就会默认创建一个线程,即主线程,他会运行main()上面的方法。

在同一时刻,也只能有一个线程是在运行的,他和进程一样,我们从宏观上看,好似同一时刻执行了很多线程,在微观上,是每个线程在不同时刻执行

单线程程序

即代码按照调用顺序从上往下执行,没有两段代码交替执行的程序被称为单线程,即只有一个主线程
在这里插入图片描述这种情况下,两个死循环不会交替执行,因为单线程只能从上到下执行,一段程序没有执行完成,则不会执行下面的程序

多线程程序

即可以多段代码交替执行的程序,我们可以通过创建多条线程来实现多线程程序。也是学习的重点。
我们把上面单线程的代码改成多线程
在这里插入图片描述可以看到,两个死循环可交替运行

线程的创建

Java中提供了两种实现多线程的方式

  1. 继承java.lang包下的Thread类,覆写Thread类的run()方法,在run()方法中运行在线程上的代码
  2. 实现Java.lang.Runnable接口,同样是在run()方法中实现运行在线程上的代码

通过继承实现多线程

方法

继承java.lang包下的Thread类,覆写Thread类的run()方法,在run()方法中运行在线程上的代码

步骤

我们可以写一个类来继承Thread类,然后重写里面的run()方法,我们调用由我们的类创建的对象的start()方法,就可启动一个新线程,线程启动后会自动调用run()方法。

如图
记得先导入对应的包
在这里插入图片描述

通过继承实现多线程的弊端

一个类一旦继承了某个父类便无法在通过继承Thread来实现多继承

通过实现接口实现多线程

方法

实现Java.lang.Runnable接口,同样是在run()方法中实现运行在线程上的代码

步骤
  1. 导入java.lang.Runnable
  2. 写一个类来实现Runnable接口,并重写run()方法,把我们要运行在另一条线程上的代码写在其中。Runnable接口中只有一个run()方法。
  3. 通过Thread类的另一个构造方法Thread(Runnable target),来创建Thread对象,Runnable target就是一个Runnable接口,这里我们传入我们实现Runnable接口的类创建的对象。
  4. 然后调用Thread对象的start()方法就可开启另一个线程,会自动调用其run()方法

如图
在这里插入图片描述这里后面的getFib()是定义的一个求斐波那契数列的方法,为的是减缓程序运行速度在这里插入图片描述

两种实现多线程方式的对比

实现Runnable接口相对于继承Thread类实现多线程有以下好处:

  1. 实现接口更适合多个相同程序代码的线程去处理同一个资源的情况,简单来说,就是可以多个线程同时处理一段代码
    比如我们编写一个售票厅,里面有100张票(总共资源100),这100张票由四个窗口(四个线程)同时发售
    如下:先来看继承实现多线程
    在这里插入图片描述可以看到,Thread实现的多线程无法实现四个窗台同时共用一个资源,他们各自发行各自的了,这明显不是我们想要的
    再来看通过实现接口来创建四个线程
    在这里插入图片描述这里我们创建一个实现接口的对象,然后将其传入我们创建的线程中(Thread th=new Thread(对象,"name")),这样便实现我们的多线程,然后创建多个线程,我们都传入我们创建的同一个对象,这样就能达到一个资源运行在多个线程上的效果
  2. 可以避免继承Thread实现多线程的无法继承别的类的局限性

正常中,我们一般用实现接口方式来实现多线程

上面两个例子中需要知道的点

获取当前线程对象的方法

Thread对象的curreadThread()方法
即:Thread th=Thread.currentThread();
在这里插入图片描述获取到当前的线程对象就可对这个线程进行操作

获取当前线程的名称

用线程对象的getName()方法
即:String name=th.getName();
如:
在这里插入图片描述获取线程名

更改线程名

用线程对象的setName();
在这里插入图片描述

创建Thread对象的另一个构造方法

在我们创建Thread对象的时候可以调用他的另一个含有两个参数的构造方法
new Thread(线程对象,"线程名")这个构造方法可以在创建线程的同时设置线程的名称

在这里插入图片描述

后台线程

Java程序有着前台线程和后台线程,只要有一个前台线程在运行,这个进程就不会结束,如果一个进程中只有后天进程,则这个进程就会结束

我们新创建的线程默认都是前台线程,如果某个线程在启动之前调用了setDaemon(true)语句,这个线程就会变成后台线程
如图
在这里插入图片描述原本应该无限打印的进程,却因为调用了setDaemon(true)(true可为任何boolean值为true的数据)在main运行结束后,此进程也结束了,(后面很多的此线程打印的数据是进程在关闭的时候有一定的延迟,然后此时,又打印了几遍)

setDaemon(true)必须在start()方法前调用




牛蛙

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值