Java多线程: 线程(Thread)

进程

进程是一个独立功能的程序,是系统进行资源分配和调度的一个独立单位,重点是系统进行调度和分配的独立单位。

线程

线程是进程中的一个任务,是CPU分派和调度的基本单位。

线程和进程的区别
  • 一个进程中可以有多个线程,但最少有一个线程,也就是经常说的主线程。一个线程只能属于一个进程。
  • 每个进程都有属于自己的资源,进程间的资源不共享。同一进程中的线程间是共享本进程的资源。
  • 每个进程都有自己的独立地址空间,进程间的地址空间不共享。进程内的线程共享本进程内的地址空间。
  • 一个进程崩溃后,在系统保护机制下不会影响其它进程,一个线程崩溃后,线程所属的进程就会死掉。
  • 线程和进程都可以执行并发,既多线程和多进程。
线程的状态

线程可以根据其不同条件分为六种状态,

  1. 新建状态(new)
  2. 可运行状态(runnable)
  3. 阻塞状态(blocked)
  4. 等待状态(waiting)
  5. 计时等待状态(Timed waiting)
  6. 终止状态(Terminated)
新建状态

当一个线程被new 实例化,还没有调用线程start方法,线程的run方法还没有执行,线程处于新建状态。

可运行状态

一旦调用线程的start方法,线程就处于可运行状态。一个可运行的线程可能是正在运行也可能是没有正在运行,这取决于操作系统给线程提供的运行时间。操作系统会根据不同的处理方式(抢占式和协作式)来控制线程的控制权。

阻塞状态

当线程试图去获取内部对象锁,该锁被其它线程持有,则该线程进入阻塞状态。当该锁被所持有的线程释放后,并且操作系统允许该线程持有锁时,线程进入非阻塞状态。

等待状态

当线程等待另一个线程通知系统调度一个条件时,该线程进入等待状态。

计时等待

有几个方法是有一个超时参数的,调用它们的线程进入计时等待状态。这个状态持续到超时期满或者接收到适当的通知后结束。带超时参数的等待方法有Thread.sleep、object.wait、Thread.join、Lock.tryLock和Condition.await的计时版方法。

终止状态

线程因以下两个原因被终止。

  • run正常退出而自然终止。
  • 因为一个没有捕获的异常导致run方法终止而意外终止。
线程的属性
线程的优先级

每个线程都有优先级,一般都情况下,每当线程调度器有机会选择新线程时,会优先选择优先级高的线程。但是线程的优先级高度依赖系统。

  • 线程的优先级通过setPriority(int newPriority)方法设置,设置范围为MIN_PRIORITY (在Thread中定义为1)和MAX_PRIORITY(在Thread中定义为10)之间,一般默认的为NORMAL_PRIORITY(在Thread中定义为5)。
  • 操作系统的优先级 windows系统有7个优先级,在sun为lunx提供的java虚拟机,线程的优先级被忽略,所有线程的优先级相同。
守护线程

通过调用线程的setDaemon(true)方法吧线程设置为守护线程。守护线程的作用是为其它线程提供服务。例如java的垃圾回收(GC)线程。

  • 当程序只剩下守护线程时,程序会退出。
  • 守护线程永远不应该访问固有资源,如文件,数据库等,因为它会在任何时候发生中断。
未捕获异常处理器

每个线程都可以设置一个未捕获异常处理器,通过调用setUncaughtExceptionHandler()设置。

  • 通过实现Thread.UncaughtExceptionHandler接口,实现线程都未捕获异常处理器,里面有uncaughtException(Thread,Throwable)。
  • 可以通过调用Thread的setDefaultUncaughtExceptionHandler静态方法为所有线程提供一个默认的未捕获异常处理器。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值