关于线程/多线程(1)

关于线程/多线程(1)

什么是线程/多线程

首先我们要明白在操作系统中的多任务:在同一刻运行多个程序的能力。至于怎么实现的主要是操作系统将CPU的时间片分配给每一个进程,给人以并行处理的感觉

那么我们的多线程程序就是在较低层次上扩展了多任务的概念:一个程序同时执行多个任务,每一个任务称为一个线程。

那么多线程和多进程的区别在哪呢?本质区别在于每个进程拥有自己的一套变量,而线程则是共享数据。

中断线程

在早期的java版本中,有一个stop方法,其他方法可以调用它以终止线程,但是这个方法已经弃用了。(主要是由于stop的不安全性,你无法知道什么时候调用stop是安全的,什么时候不会对对象造成破坏。)

所以在现在没有可以强制终止线程的方法,但是可以用interrupt方法来请求终止线程。当调用interrupt方法时,该个线程的boolean标志也就是中断状态应该被置位,而每个线程都应该时不时检查这个标志,以判断自己是否被中断。

当然,如果线程被阻塞,就无法检测中断状态,就会抛出InterruptedException异常。

线程状态

线程有一下6种状态:

  • New(新创建)
  • Runnable(可运行)
  • Blocked(被阻塞)
  • Waiting(等待)
  • Timed waiting(计时等待)
  • Terminated(被终止)

新创建线程

如 new Thread(r),此时线程还没有开始运行,这意味着它的状态还是new。

可运行线程

如 r.start ,此时此案城处于runnable状态,一个可运行的线程可能在运行也可能没在运行。比如说在时间片用完之后,操作系统剥夺了该线程的运行权,并给另一个线程时间片来执行任务,这个时候该线程虽然处于runnable状态但是并没有运行。

被阻塞和等待线程

当线程处于这两个状态时,它暂时不活动。它不运行任何代码且消耗最少的资源直到进程调度器重新激活它。下面讨论一下是怎样达到这个状态的。

  • 当一个线程试图获取一个内部对象的对象锁时,该锁被其他线程持有,则进入阻塞状态。
  • 当线程等待另一个线程通知调度器一个条件时,它自己进入等待状态。在调用Object.wait方法或Thread.join方法时就会出现这种情况
  • 有几个方法有一个超时参数。调用他们导致线程进入计时等待状态。如Thread.sleep、Object.wait、Thread.join、Lock.tryLock以及Condition.awaitd的计时版

线程死亡

  • 因为run方法正常退出而死亡。
  • 因为一个没有捕获的异常终止了run方法而意外死亡。

线程优先级

在默认情况下,一个线程继承它的父线程的优先级,也可以使用setPriority方法提高或者降低任何一个线程的优先级。优先级必须在MIN_PRIORITY(1)和MAX_PRIORITY(10)之间的任何值。NORM_PRIORITY被定义为5.

当线程调度器选择新线程时,它首先选择具有较高优先级的线程,但是,线程的优先级是高度依赖于系统的,也就是说java线程的优先级映射在宿主主机平台的优先级上时,优先级可能更多,可能更少。

例如:Windows有7个优先级,而在Oracle为Linux提供的java虚拟机中,线程的优先级被忽略——所有线程具有相同的优先级。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值