Thread.yield()的调用是对线程调度器(Java线程机制的一部分,可以将CPU从一个线程转移到另一个线程)的一种建议,它在声明:"我已经执行完生命周期中最重要的部分了,此刻正是切换给其它任务执行一段时间的大好时机",这完全是选择性的,也就是说可能不会转移到其它线程。
yield()应该做的是让当前运行线程回到可运行状态,以允许具有相同优先级的其他线程获得运行机会。因此,使用yield()的目的是让相同优先级的线程之间能适当的轮转执行。但是,实际中无法保证yield()达到让步目的,因为让步的线程还有可能被线程调度程序再次选中。
结论:yield()从未导致线程转到等待/睡眠/阻塞状态。在大多数情况下,yield()将导致线程从运行状态转到可运行状态,但有可能没有效果。
Thread.sleep(毫秒数),用在线程的run()方法中,目的是让执行的线程暂停一段时间,那么此时线程的状态是休眠状态,当指定休眠的时间到期,线程就进入可运行状态,但不是运行状态,因此,sleep()中指定的时间是线程不会运行的最短时间,sleep()方法不保证时间到期之后,线程就立即执行。
线程的优先级,尽管CPU处理现有线程集的顺序是不确定的,但是调度器将倾向于让优先权高的线程先执行,然而这并不意味着优先权较低的线程将得不到执行,优先级较低的线程仅仅是执行频率较低。
join()方法,一个线程可以在其它线程之上掉用join()方法,其效果是等待一段时间直到第二个线程结束才继续执行。
由于线程的本质,所以不能在线程外部捕获从线程中逃逸出的异常,一旦异常逃出任务的run()方法,它就会向外传播到控制台。
所有对象都自动含有一把锁(也称为监视器),当在对象上调用其任意的synchronized方法的时候,此对象都被加锁,这时该对象上的其它synchronized方法只有等到前一个方法调用完毕并释放了锁之后才能被调用。其所有的synchronized方法共享同一个锁。
一个任务可以多次获得对象的锁,如果一个方法在同一个对象上调用了第二个方法,后者又调用了同一个对象上的另一个方法,就会发生这种情况,JVM负责跟踪对象被加锁的次数,如果一个对象被解锁(即锁被完全释放),其计数变为0。在任务第一次给对象加锁的时候,计数变为1,每当这个相同的任务在这个对象上获得锁时,计数都会增加,显然,只有首先获得了锁的任务才能允许继续获得多个锁。每当任务离开一个synchronized方法,计数递减,当计数为0时,锁完全被释放。
针对每一个类,也有一个锁(作为Class对象的一部分),所以synchronized static方法可以在类的范围内防止对static数据的访问。
临界区:有时,只是希望防止多个线程同时访问方法内部的部分代码而不是防止访问整个方法,通过这种方式隔离出来的代码被称为临界区,它也使用synchronized关键字建立,这里synchronized被用来指定某个对象,此对象被用来对花括号内的代码进行同步控制。
在进入临济区代码块之前,必须获得synchronized关键字中对象的锁,如果有其它的线程已经得到这个锁,那么就得等到锁被释放之后,才能进入临界区。
线程的本地存储
线程本地存储是一种自动化机制,可以为使用相同变量的每个不同的线程都创建不同的存储,如果你有5个线程都要使用变量x所表示的对象,那么线程本地存储就会生成5个用于x的不同的存储块。主要是,它们使得你可以将状态与线程关联起来。
Thread类包含interrupt()方法,因此你可以终止被阻塞的任务,这个方法将设置线程的中断状态,如果一个线程已经被阻塞了,或者试图执行一个阻塞操作,那么设置线程的中断状态将会抛出InterruptedException,当抛出该异常或者该任务掉用Thread.interrupt()方法时,中断状态被复位。

java线程(2016-4-7)的更多相关文章

  1. 【Java线程池快速学习教程】

    1. Java线程池 线程池:顾名思义,用一个池子装载多个线程,使用池子去管理多个线程. 问题来源:应用大量通过new Thread()方法创建执行时间短的线程,较大的消耗系统资源并且系统的响应速度变 ...

  2. java线程大全一讲通

    Java线程:概念与原理 一.操作系统中线程和进程的概念 现在的操作系统是多任务操作系统.多线程是实现多任务的一种方式. 进程是指一个内存中运行的应用程序,每个进程都有自己独立的一块内存空间,一个进程 ...

  3. 谈谈 Java 线程状态相关的几个方法

    http://blog.jrwang.me/2016/java-thread-states/ 发表于 2016-07-23 在 Java 多线程编程中,sleep(), interrupt(), wa ...

  4. Java线程池快速学习教程

    1. Java线程池 线程池:顾名思义,用一个池子装载多个线程,使用池子去管理多个线程. 问题来源:应用大量通过new Thread()方法创建执行时间短的线程,较大的消耗系统资源并且系统的响应速度变 ...

  5. Java线程并发:知识点

    Java线程并发:知识点   发布:一个对象是使它能够被当前范围之外的代码所引用: 常见形式:将对象的的引用存储到公共静态域:非私有方法中返回引用:发布内部类实例,包含引用.   逃逸:在对象尚未准备 ...

  6. Java线程的概念

    1.      计算机系统 使用高速缓存来作为内存与处理器之间的缓冲,将运算需要用到的数据复制到缓存中,让计算能快速进行:当运算结束后再从缓存同步回内存之中,这样处理器就无需等待缓慢的内存读写了. 缓 ...

  7. Java 线程池框架核心代码分析--转

    原文地址:http://www.codeceo.com/article/java-thread-pool-kernal.html 前言 多线程编程中,为每个任务分配一个线程是不现实的,线程创建的开销和 ...

  8. 细说进程五种状态的生老病死——双胞胎兄弟Java线程

    java线程的五种状态其实要真正高清,只需要明白计算机操作系统中进程的知识,原理都是相同的. 系统根据PCB结构中的状态值控制进程. 单CPU系统中,任一时刻处于执行状态的进程只有一个. 进程的五种状 ...

  9. 【转载】 Java线程面试题 Top 50

    Java线程面试题 Top 50 不管你是新程序员还是老手,你一定在面试中遇到过有关线程的问题.Java语言一个重要的特点就是内置了对并发的支持,让Java大受企业和程序员 的欢迎.大多数待遇丰厚的J ...

  10. 第24章 java线程(3)-线程的生命周期

    java线程(3)-线程的生命周期 1.两种生命周期流转图 ** 生命周期:**一个事物冲从出生的那一刻开始到最终死亡中间的过程 在事物的漫长的生命周期过程中,总会经历不同的状态(婴儿状态/青少年状态 ...

随机推荐

  1. snakebar 的使用

    在一次文章阅读的时候,我浏览到一篇文章关于一个新控件的使用,这个控件就是SnakeBar 该控件和Toast控件一样,在程序运行中起着提示的功能. 效果图如下: 代码如下: Snackbar.make ...

  2. Linux中总线设备驱动模型及平台设备驱动实例

    本文将简要地介绍Linux总线设备驱动模型及其实现方式,并不会过多地涉及其在内核中的具体实现,最后,本文将会以平台总线为例介绍设备和驱动程序的实现过程. 目录: 一.总线设备驱动模型总体介绍及其实现方 ...

  3. MATLAB基础知识之内存映射

    如果我们的文件太大而不能一次性加载进内存,我们可以创建一个memmapfile对象,这样可以将原始数据当做数组一样来访问,并且同样的通过下标访问数据. 用MNIST数据()举个例子: [Xtrain, ...

  4. (转)我看PhD by 王珢

    我看PhD by 王垠 前段时间看了一下这些关于 PhD 的负面信息: 一个专门反对读 PhD 的 BLOG 叫“100 Reasons NOT to Go to Graduate School”(下 ...

  5. Learn ZYNC (6)

    最近在关注的问题是怎么样从ps端丢数据到ram, 然后用ip核进行处理后再输送到ram,ps端可以读取. 参考文献:[OpenHW参赛手记]AXI-Stream接口开发详细流程 首先按照作者的探索思路 ...

  6. Junit测试 - Spring的配置

    第一种: @ContextConfiguration(locations = {"classpath*:/spring-core.xml"}) public class UserM ...

  7. 关于java.lang.NoSuchMethodError: android.widget.RelativeLayout.setBackground的解决办法

    今天用一个安卓4.0.4版本的手机测试手上的项目,发现logcat弹出这样一个提示“java.lang.NoSuchMethodError: android.widget.RelativeLayout ...

  8. 引用log4j.jar包后,出现告警

    问题现象:在引用log4j包后,使用自己导出的jar包,编译测试例代码,在启动浏览器时出现以下告警:log4j:WARN No appenders could be found for logger ...

  9. 初识Java泛型以及桥接方法

    泛型的由来 在编写程序时,可能会有这样的需求:容器类,比如java中常见的list等.为了使容器可以保存多种类型的数据,需要编写多种容器类,每一个容器类中规定好了可以操作的数据类型.此时可能会有Int ...

  10. Symbols

    https://hacks.mozilla.org/2015/06/es6-in-depth-symbols/ <script> function w(wcon) { console.lo ...