【多线程】Thread类的基本用法

在Java中接触线程,避免不了去使用一个类Thread类,该类是创建线程的关键,它是创建线程的前提,下面介绍一些有关Thread类的基本用法。

一:线程的创建:

第一种,通过重新写一个Mythread类,通过向上转型的方式继承Thread类,并重写run方法:

 

 第二种,通过重新写一个Myrunnable类,然后继承Runnable接口,重写run方法,然后在main线程里面创建Thread类,然后实例化Myrunnable对象,作为参数传入新创建的Thread类:

 

 第三种,通过Thread实例化时候创建匿名内部类的方式来新建线程,并且重写run方法

 第四种,通过匿名内部类的方式实例化Runnable并重写run方法,将其作为参数传入给Thread线程。

 第五种,实例化Thread类的时候传入参数new Runnable类并重写run方法:

 第六种,通过lambda表达式来创建Thread线程:

 注意此时不需要重写run方法,而是直接在里面写需要执行的任务。

注意区分Thread.run和Thread.start 区别:

二者都是Thread类里面的方法,但是run方法作用只是执行任务,可以通过实例化Thread类然后调用该方法执行任务,但是start方法作用是开启一个新的线程,这里的新线程是与main线程同级作为前台线程,二者都执行完了该程序进程才算执行完成。

因此run与start区别可以概括为:start开启了新的线程,进而执行新线程里面的任务

而run只是一个类里面的普通的方法,可以通过平常调用类中方法的方式来调用该方法,并没有启动新的线程。

二、线程的休眠:

线程的休眠,即通过调用Thread.sleep()方法来进行,括号里面的放入数字,单位为ms(毫秒)即1000ms=1秒。通过sleep进行休眠后,线程发生阻塞,即线程中的PCB(这里PCB可以和线程作为相等的来理解)从就绪队列(随时可以被操作系统的调度器调用)放入至阻塞队列(不能被操作系统的调度器进行调用),这两个队列为双向链表。在sleep执行完之后,PCB就从阻塞队列加入进就绪队列,但是由于操作系统的调度器调用是随机调用(根据操作系统对资源的开销进行随即调用),所以即使将从阻塞队列放回就绪队列,依然不一定立刻就执行该线程,因为随机调用的机制,不一定立刻从就绪队列找到该线程进行执行,但是会依然会执行,只不过晚一点点,误差不超过10ms。

三、线程的中断

线程的中断是通过线程的标记来执行:通过两个方法:

1:Thread.currentThread().isInterrupted 获取线程的标记

2:Thread.interrupted获取线程标记

这两个都是放在run方法里面来获取线程的标记,

线程在执行状态则二者都返回true,若在阻塞状态则返回false,便于在该线程以外的线程例如main线程对新线程进行控制,控制规则为:

1>当新线程为执行状态,在新线程外调用Thread.interrupt()方法,将新线程标记从true改为false,

2>当新线程为阻塞状态,在新线程外调用Thread.interrupt()方法,则新线程所执行的方法会抛出异常,例如新线程正在调用sleep()方法进行阻塞,此时在新线程外调用interrupt()方法,此时sleep()方法会抛出异常,便于利用try-catch进行捕获进行下一步对新线程的操作。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值