Java核心技术卷1 第十四章 多线程

14.1 什么是线程
一个程序同时可以执行多个任务。通常,每一个任务称为一个线程,可以同时运行一个以上线程的程序称为多线程程序。

多进程与多线程的区别:

  • 每个进程拥有自己的一整套变量,而线程则共享数据。听起来有些危险。

  • 然而,共享变量使线程之间的通信比进程间通信更有效,更容易。

  • 与进程相比,线程更轻量级,创建,撤销一个线程比启动新进程的开销要小的多。

Thread.sleep();调用这个Thread类的静态方法,不会创建一个新线程,用于暂停当前线程的活动。

使用线程给其他任务提供机会
可以将耗时任务,移动球的代码放置在一个独立的线程中。可以提高其响应能力,实际,可以发起多个球,都运行在自己的线程中。

14.2 中断线程
当线程的run方法执行方法体中最后一条语句后,并经由执行return语句返回时,或出现了在方法中没有捕获的异常时,线程将终止。

  • 强制终止线程:
    有一种可以强制线程终止的方法,interrupt方法可以用来请求终止线程。
    当对一个线程调用interrupt方法时,线程的中断状态将被置位。这是每一个线程都具有的boolean标志。每个线程都应该不时地检查这个标志,以判读线程是否被中断。

  • 要弄清中断状态是否被置位,
    首先调用静态的Thread.currentThread方法获得当前线程,然后调用 isInterrupted方法。
    while(!Thread.currentThread().isInterrupted()){
    do more work
    }
    如果线程被阻塞,就无法检测中断状态。

14.3 线程状态
New 新创建 Runnable 可运行 Blocked 被阻塞 Waiting 等待 Timed waiting 计时等待 Terminated 被终止
要确定一个线程的当前状态,可调用 getState方法。
1、新创建线程
当用new操作符创建一个新线程时,如new Thread() ,该线程还没有开始运行。

2、 可运行线程
一旦调用 start方法,线程处于 runnable状态。一个可运行的线程可能正在运行也可能没有运行。这取决于操作系统给线程提供运行的时间。一个正在运行的线程仍然处于可运行状态。
一旦一个线程开始运行,他不必始终保持运行。事实上,运行中的线程被中断,目的是为了其他线程获得运行机会。线程调度的细节依赖于操作系统提供的服务。
抢占式调度系统给每一个可运行线程一个时间片来执行任务。当时间片用完,操作系统剥夺该线程的运行权,并给另一个线程运行机会。当选择下一个线程时,操作系统考虑线程的优先级。
桌面及服务器操作系统都使用抢占式调度。Android也采用该模式,基于线程优先级来决定CPU的使用权。
3.被阻塞线程和等待线程
当线程处于被阻塞或等待状态时,它暂时不活动。它不运行任何代码且消耗最少的资源。直到线程调度器重新激活它。细节取决于它是怎样达到非活动状态的。

  • 当一个线程试图获取一个内部的对象锁,而该锁被其他线程持有,则该线程进入阻塞状态。当所有其他线程释放该锁,并且线程调度器允许本线程持有它的时候,该线程将变成非阻塞状态。

  • 当线程等待另一个线程通知调度器一个条件时,它自己进入等待状态。被阻塞状态与等待状态有很大不同。

  • 有几个方法有一个超时参数。调用它们导致线程进入计时等待状态。这一状态一直保持到超时期满或接收到适当的通知。带有超时参数的方法有 Thread.sleep和

Object.wait, Thread.join , Lock.tryLock及 Condition.await的计时版。
当一个线程被阻塞或等待时,另一个线程被调度为运行状态。当一个线程被重新激活,调度器检查它是否具有比当前运行线程更高的优先级。如果是,调度器从当前运行线程中挑选一个,剥夺其运行权,选择一个新的线程运行。

你可能感兴趣的:(Java核心技术卷1 第十四章 多线程)