Java多线程(六)——线程让步】的更多相关文章

参考文献: http://www.blogjava.net/xylz/archive/2010/07/19/326527.html 一.ConcurrentMap API 从这一节开始正式进入并发容器的部分,来看看JDK 6带来了哪些并发容器. 在JDK 1.4以下只有Vector和Hashtable是线程安全的集合(也称并发容器,Collections.synchronized*系列也可以看作是线程安全的实现).从JDK 5开始增加了线程安全的Map接口ConcurrentMap和线程安全的队…
多线程系列终于终结得差不多,本人对该系列所做的总结大致如下: 线程锁模块耗费了大量的时间,底层的AQS实现比较复杂.仍然没有时间总结源码部分,能够坚持写下这么几个篇幅的内容真心佩服自己....希望继续日后能够继续抽空进行学习总结,提高自身的开发能力.…
有的时候对于Java多线程,我们会听到“父线程.子线程”的概念. 严格的说,Java中不存在实质上的父子关系 没有方法可以获取一个线程的父线程,也没有方法可以获取一个线程所有的子线程 子线程的消亡与父线程的消亡并没有任何关系,不会因为父线程的结束而导致子线程退出(操作系统中如此). 父线程说法来源 父线程的说法应该是来自于Thread的构造对象时的初始化方法 再次看一下init方法,以下内容截取关键部分 可以看得出来,在init方法中,将创建这个线程的当前线程定义为“父”         Thr…
Java多线程之线程协作 一.前言 上一节提到,如果有一个线程正在运行synchronized 方法,那么其他线程就无法再运行这个方法了.这就是简单的互斥处理. 假如我们现在想执行更加精确的控制,而不是单纯地等待其他线程运行终止,例如下面这样的控制. ● 如果空间为空则写入数据:如果非空则一直等待到变空为止 ● 空间已为空时,“通知”正在等待的线程 此处是根据“空间是否为空”这个条件来执行线程控制的.Java 提供了用于执行线程控制的wait 方法.notify 方法和notifyAll 方法.…
一.序言 Java多线程编程线程池被广泛使用,甚至成为了标配. 线程池本质是池化技术的应用,和连接池类似,创建连接与关闭连接属于耗时操作,创建线程与销毁线程也属于重操作,为了提高效率,先提前创建好一批线程,当有需要使用线程时从线程池取出,用完后放回线程池,这样避免了频繁创建与销毁线程. // 任务 Runnable runnable = () -> System.out.println(Thread.currentThread().getId()); 在应用中优先选用线程池执行异步任务,根据不同…
Java多线程之线程其他类 实际编码中除了前面讲到的常用的类之外,还有几个其他类也有可能用得到,这里来统一整理一下: 1,Callable接口和Future接口 JDK1.5以后提供了上面这2个接口,可以把Callable接口看成Runnable接口的增强版,Callable接口提供call方法作为线程执行体,但是call方法比run方法强大,call方法可以有返回值,call方法可以声明抛出异常.为了获取call方法的返回值,JDK1.5提供了Future接口来代表Callable接口里面ca…
Java多线程之线程的通信 在总结多线程通信前先介绍一个概念:锁池.线程因为未拿到锁标记而发生的阻塞不同于前面五个基本状态中的阻塞,称为锁池.每个对象都有自己的锁池的空间,用于放置等待运行的线程.这些线程中哪个线程拿到锁标记由系统决定.前面我们也有T到死锁的概念,线程互相等待其他线程释放锁标记,而又不释放自己的:造成无休止地等待.当出现死锁的时候,我们应该如何解决呢?通过线程间的通信解决. 线程间通信: 多线程之间的通信有2种方式,第一种是使用object类的几个方法,第二种是使用条件变了来控制…
Java多线程之线程的同步 实际开发中我们也经常提到说线程安全问题,那么什么是线程安全问题呢? 线程不安全就是说在多线程编程中出现了错误情况,由于系统的线程调度具有一定的随机性,当使用多个线程来访问同一个数据时,非常容易出现线程安全问题.具体原因如下:   1,多个线程同时访问一个数据资源(该资源称为临界资源),形成数据发生不一致和不完整.   2,数据的不一致往往是因为一个线程中的多个关联的操作(这几个操作合成原子操作)未全部完成. 关于线程安全问题,有一个经典的情景:银行取钱.代码如下: /…
Java多线程之线程的控制 线程中的7 种非常重要的状态:  初始New.可运行Runnable.运行Running.阻塞Blocked.锁池lock_pool.等待队列wait_pool.结束Dead 如果将"锁池"和"等待队列"都看成是"阻塞"状态的特殊情况,那么可以将线程归纳为5个状态: 新建,就绪,运行,阻塞,死亡.                                                           ┌--…
Java多线程的线程同步和线程通信的一些小问题(顺便分享几篇质量高的博文) 前言:在学习多线程时,遇到了一些问题,这里我将这些问题都分享出来,同时也分享了几篇其他博客主的博客,并且将我个人的理解也分享给大家,本人的水平有限,如果我的分析或者结论有错误希望大家一定要帮我指出来,我好能改正和提高. 一.对于线程同步和同步锁的理解(注:分享了三篇高质量的博客) 以下我精心的挑选了几篇博文,分别是关于对线程同步的理解和如何选择线程锁以及了解线程锁的作用范围. <一>线程同步锁的选择 1. 这里我推荐下…
Java多线程2(线程安全.线程同步.等待唤醒机制.单例设计模式) 1.线程安全 如果有多个线程在同时运行,而这些线程可能会同时运行这段代码.程序每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的. 通过案例演示线程的安全问题:电影院要卖票. 我们模拟电影院的卖票过程.假设本场电影的座位共100个(本场电影只能卖100张票). 我们来模拟电影院的售票窗口,实现多个窗口同时卖这场电影的票(多个窗口一起卖这100张票) 需要窗口,采用线程对象来模拟: 需要票…
(转发) 收藏 记 周日,北京的天阳光明媚,9月,北京的秋格外肃穆透彻,望望窗外的湛蓝的天,心似透过栏杆,沐浴在这透亮清澈的蓝天里,那朵朵白云如同一朵棉絮,心意畅想....思绪外扬, 鱼和熊掌不可兼得,徜徉在知识的海洋里,收获满满...比起这时光,尽管有些可惜.还是 充满满足,或许在心里想想外边的美好,更美吧....... 一,介绍 本总结我对于JAVA多线程中线程之间的通信方式的理解,主要以代码结合文字的方式来讨论线程间的通信,故摘抄了书中的一些示例代码. 二,线程间的通信方式 ①同步 这里讲…
转自(http://blog.csdn.net/jerrying0203/article/details/45563947) 本文学习并总结java多线程与线程间通信的原理和方法,内容涉及java线程的众多常见重要知识点,学习后会对java多线程概念及线程间通信方式有直观清晰的了解和掌握,可以编写并分析简单的多线程程序. 进程与线程 进程:是一个正在执行的程序. 每一个进程执行都有执行顺序,一个执行顺序是一个执行路径,或者叫控制单元; 每一个程序启动时,都会在内存中分配一片空间,进程就用于标识这…
java多线程之线程死锁 产生死锁的主要原因: 由于系统资源不足. 进程执行推进的顺序不合适. 资源分配不当等. 假设系统资源充足.进程的资源请求都可以得到满足,死锁出现的可能性就非常低.否则就会因争夺有限的资源而陷入死锁.其次, 进程执行推进顺序与速度不同,也可能产生死锁. 产生死锁的四个必要条件:  相互排斥条件:一个资源每次仅仅能被一个进程使用. 请求与保持条件:一个进程因请求资源而堵塞时,对已获得的资源保持不放. 不剥夺条件:进程已获得的资源.在末使用完之前.不能强行剥夺. 循环等待条件…
Java多线程之线程的生命周期 一.前言 当线程被创建并启动以后,它既不是一启动就进入了执行状态,也不是一直处于执行状态.在线程的生命周期中,它要经过新建(New).就绪(Runnable).运行(Running).阻塞(Blocked)和死亡(Dead)5种状态.尤其是当线程启动以后,它不可能一直"霸占"着CPU独自运行,所以CPU需要在多条线程之间切换,于是线程状态也会多次在运行.阻塞之间切换 新建状态,当程序使用new关键字创建了一个线程之后,该线程就处于新建状态,此时仅由JVM…
Java多线程之线程的状态迁移 下图整理了线程的状态迁移.图中的线程状态(Thread.Stat 中定义的Enum 名)NEW.RUNNABLE .TERMINATED.WAITING.TIMED_WAITING 和BLOCKED 都能够在程序中查到.各个状态的值都可以通过Thread 类的getState 方法获取. 详细内容以后再做补充,大家可关注我的博文. 线程的状态迁移图 图片来自:图解Java多线程设计模式 一书…
Java多线程之线程的互斥处理 一.前言 多线程程序中的各个线程都是自由运行的,所以它们有时就会同时操作同一个实例.这在某些情况下会引发问题.例如,从银行账户取款时,余额确认部分的代码应该是像下面这样的. if (可用余额大于取款金额) { 从可用余额中减掉取款金额 } 首先确认可用余额,确认是否允许取款.如果允许,则从可用余额上减掉取款金额.这样才不会导致可用余额变为负数. 但是,如果两个线程同时执行这段代码,那么可用余额就有可能会变为负数. 假设可用余额=1000元,取款金额= 1000元,…
Java多线程之线程的暂停 下面该稍微休息一下了呢……不过,这里说的是线程休息,不是我们哦.本节将介绍一下让线程暂停运行的方法. 线程Thread 类中的sleep 方法能够暂停线程运行,Sleep 也就是“休眠”的意思.sleep 方法是Thread 类的静态方法. 下面这条语句可以将当前的线程(执行这条语句的线程)暂停约1000 毫秒(约1 秒). Thread.sleep(1000); 如下代码会输出10 次Good! 字符串,而每输出1 次,线程就暂停约1000 毫秒(约1 秒).也就是…
Java多线程之线程的启动 一.前言 启动线程的方法有如下两种. 利用Thread 类的子类的实例启动线程 利用Runnable 接口的实现类的实例启动线程 最后再介绍下java.util.concurrent.ThreadFactory中的线程创建 下面分别做以介绍 二.利用Thread 类的子类启动线程 这里来学习一下利用Thread 类的子类的实例来启动线程的方法,即上一篇博文中使用的方法.我们构造一个PrintThread 类表示输出1000次指定字符串的线程.输出的字符串通过构造函数的…
Java多线程——查看线程堆栈信息 摘要:本文主要介绍了查看线程堆栈信息的方法. 使用Thread类的getAllStackTraces()方法 方法定义 可以看到getAllStackTraces()方法的返回值是一个Map对象,key是Thread的实例,value是一个StackTraceElement实例数组: public static Map<Thread, StackTraceElement[]> getAllStackTraces() 使用 可以使用这个静态方法在页面上循环打印…
Java多线程| 01 | 线程概述 线程相关概念 进程与线程 进程:进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是操作系统进行资源分配与调度的基本单位.可以把进程简单的理解为正在操作系统中运行的一个程序. 线程:线程(thread)是进程的一个执行单元.一个线程就是进程中一个单一顺序的控制流,进程的一个执行分支进程是线程的容器,一个进程至少有一个线程.一个进程中也可以有多个线程 在操作系统中是以进程为单位分配资源,如虚拟存储空间,文件描述符等.每个线程都有各自的线程栈…
Java 多线程:线程池 作者:Grey 原文地址: 博客园:Java 多线程:线程池 CSDN:Java 多线程:线程池 工作原理 线程池内部是通过队列结合线程实现的,当我们利用线程池执行任务时: 如果此时线程池中的线程数量小于corePoolSize,即使线程池中的线程都处于空闲状态,也要创建新的线程来处理被添加的任务. 如果此时线程池中的线程数量等于corePoolSize,但是缓冲队列workQueue未满,那么任务被放入缓冲队列. 如果此时线程池中的线程数量大于等于corePoolSi…
一.概述 标题很抽象,什么叫更方便?更是相比谁来说的呢? 原来,我们定义任务,都是实现自Runnable或者Callable接口,但是这样必然需要你将新定义的任务附着给线程,然后再调用线程启动.在不考虑Executor的情况下,你会感觉这么做很呆板,如果直接new一个任务对象,他自己就能启动的话,是不是更好?这就是更方便的线程这个标题的由来. 二.实现 1.继承自Thread 因为Thread实现了Runnable接口,所以继承自Thread的类,实现其run方法,其中定义的也就是任务. 这样做…
一.线程的生命周期 线程状态转换图: 1.新建状态 用new关键字和Thread类或其子类建立一个线程对象后,该线程对象就处于新生状态.处于新生状态的线程有自己的内存空间,通过调用start方法进入就绪状态(runnable). 注意:不能对已经启动的线程再次调用start()方法,否则会出现Java.lang.IllegalThreadStateException异常. 2.就绪状态 处于就绪状态的线程已经具备了运行条件,但还没有分配到CPU,处于线程就绪队列(尽管是采用队列形式,事实上,把它…
一.同步问题提出 线程的同步是为了防止多个线程访问一个数据对象时,对数据造成的破坏. 例如:两个线程ThreadA.ThreadB都操作同一个对象Foo对象,并修改Foo对象上的数据. publicclass Foo { privateint x = 100; publicint getX() { return x;     } publicint fix(int y) {         x = x - y; return x;     } } publicclass MyRunnable i…
以下内容整理自:http://blog.csdn.net/wtyvhreal/article/details/44176369 线程:是指进程中的一个执行流程.  线程与进程的区别:每个进程都需要操作系统为其分配独立的内存地址空间,而同一进程中的所有线程在同一块地址空间中工作,这些线程可以共享同一块内存和系统资源. Java实现多线程的方法有两种,一是继承Thread类.二是实现Runnable接口. 一.继承Thread类 public class ThreadTest extends Thr…
六.多线程,线程,同步 ①概念: 并行:指两个或多个在时间同一时刻发生(同时发生) 并发:指两个或多个事件在同一时间段内发生 具体概念: 在操作系统中,安装了多个程序,并发指的是在一段时间内宏观上有多个程序同时运行, 这在单 CPU 系统中,每一时刻只能有一道程序执行,即微观上这些程序是分时的交替运行, 只不过是给人的感觉是同时运行,那是因为分时交替运行的时间是非常短的. 而在多个 CPU 系统中,则这些可以并发执行的程序便可以分配到多个处理器上(CPU), 实现多任务并行执行,即利用每个处理器…
目录 Java多线程(一) 一.线程的定义 二.Synchronize线程同步 三.偏向锁.自旋锁.重量级锁 四.volatile关键字 五.Compare And Swap无锁自旋优化技术和ABA版本号机制 六.乐观锁和悲观锁(参考https://blog.csdn.net/qq_34337272/article/details/81072874) 七.公平锁.非公平锁 Java多线程(一) 一.线程的定义 一个程序中不同的分支进行执行 二.Synchronize线程同步 概念:线程同步指的是…
Java多线程(一).多线程的基本概念和使用 2012-09-10 16:06 5108人阅读 评论(0) 收藏 举报  分类: javaSE综合知识点(14)  版权声明:本文为博主原创文章,未经博主允许不得转载. 一.进程和线程的基础知识 1.进程和线程的概念 进程:运行中的应用程序称为进程,拥有系统资源(cpu.内存) 线程:进程中的一段代码,一个进程中可以有多段代码.本身不拥有资源(共享所在进程的资源) 在Java中,程序入口被自动创建为主线程,在主线程中可以创建多个子线程. 区别: 1…
在使用多线程的时候,经常需要多个线程进行协作来完成一件事情.在前面两章分析了Java多线程的基本使用以及利用synchronized来实现多个线程同步调用方法或者执行代码块.但上面两章的内容涉及到的例子以及使用的多线程代码都是独自运行,两个程序除了竞争同一个对象以外,没有任何联系. 这次内容将讲解当多个线程需要协作来完成一件事情的时候,如何去等待其他线程执行,又如何当线程执行完去通知其他线程结束等待. 本次主要介绍如下内容: 等待/通知机制 join方法的使用 所有的代码均在char03线程间通…