线程的创建

在java中,提供了一个Thread类,来表示线程。

创建多线程的五种方法

创建多线程一般来说先创建子类,继承Thread类,然后重写run方法。

run方法内部的描述了这个线程的内部要执行哪些代码,因为每个线程都是并发执行的(自己执行自己的),使用需要告知这个线程,执行的代码是啥,run方法是线程创建之后才会被执行的。

t.start()代码被调用就是创建了t这个对象的线程,然后才会进入线程里面去执行run方法里面的内容,调用t.start方法之前线程是没有被创建的。

如果在一个代码中加入了循环条件,就要加Thread.sleep()方法来使程序休眠在循环运行时防止循环运行太快打印输出的太快,防止不能准确读到输出的信息。

sleep()操作就是 强制让这个线程线程暂停住,休眠他所示的时间这个时间(里面的时间是毫秒),会暂停1s打印一次线程1。并且sleep()中暂停的时间不是一定会暂停这个时间因为来回调度进程也会浪费时间所以一般会比里面的时间多一些。

在一个进程中,至少会有一个线程。在java程序中,至少会有一个调用mian方法的线程(系统默认调用),创建的线程t和默认的线程是并发执行的(宏观上是同时执行)。

当运行程序时线程t和线程main时

线程的运行顺序并不是按照一个顺序执行的顺序看起来是随机的,可以看出线程调度是随机的。

第二种方法创建一个类,实现Runnable接口,在创建Runnable对象传递给Thread对象。

匿名内部类创建Thread对象

匿名内部类创建Runnable对象

通常认为Runnable这种写法比较适用于实际,因为Thread是继承于类的但java中不能多继承所以就比较难与和其他线程进行交互,而Runnable实现的是接口,java中可以有多接口可以更好的与其他线程进行交互,并且这样还能使线程与线程之间的耦合更小

lambda表达式创建线程

为什么lambda创建线程不用重写run方法

当使用lambda时编译器会将其转化为一个实现了Runnable接口的对象,其表达式中的内容就是实现了对run()方法的重写。也就是lambda创建线程时里面的内容就是实现了对run()方法的隐式重写。

一个进程中的共享资源可能有数据结构(可能需要并发的读取修改或者添加数据),文件和IO资源,共享的对象,计数器和标志,数据库和内存资源。

多线程使用的必要性

多线程可以提高我们的运行速率,如当我们有两个整数变量时,分别要将其变量自增10亿次,分别使用单线程和双线程,单线程的执行实际时是650ms左右,双线程是450ms左右。

线程等待

多个线程之间,调度顺序是不确定的。线程之间的执行是按照调度器来安排的.这个过程可以视为是"无序,随机"。有些时候,我们需要能够控制线程之间的顺序。线程等待,就是其中一种,控制线程执行顺序的手段,主要是为了控制线程结束的先后顺序。

join()方法

调用join方法时,哪个线程调用,哪个线程就会发生暂停,等其他的线程执行完毕之后之间线程才会执行。并且join方法默认是死等,只有那个线程执行完毕其才会使其结束阻塞状态。也可以加入数据向其约束等待的时间。

Thread.currentThread()方法

获取当前线程的引用。

输出结果

在继承Thread类中其可以直接读取自己线程的名称,因为其类里面实现了各种所需的成员方法和成员变量,在继承自Runnable接口的对象其必须使用系统提供的因为Runnable这个接口里面只实现了run方法其他什么方法和成员变量都没有实现。lambda和Runnable一样是因为其是默认其是隐式的实现了对Runnable对其的继承。


 

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值