通过保证临界区上多个线程的相互排斥,线程同步完全可以避免竞争状态的发生,但是有时还需要线程之间的协作.有两种方式可用于线程间的通信. 1.使用条件Condition Condition接口: +await():void 当前线程等待直到发生某个条件 +signal():void 唤醒一个等待线程 +signalAll():Condition 唤醒所有等待线程 条件是通过调用Lock对象的newCondition()方法而创建的对象,为了使用条件,必须首先获取锁,await()方法让线程等待并且自…
如果一个共享资源被多个线程同时访问,可能会遭到破坏.举个例子说明这个问题,假设创建并启动100个线程,每个线程都往同一个账户中添加一个便士,代码如下: import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class AccountWithSync { private static Account account = new Account(); public stat…
GUI事件处理和绘图代码在一个被称为事件分发线程的特殊线程中执行.如果一个事件需要很长的时间处理,线程就不能顾及到队列中的其他任务.为了解决这个问题,可以运行费时的任务来处理单独线程中的事件.SwingWorker是一个实现Runnable的抽象类,可以定义一个任务来扩展SwingWorker,使用任务产生的结果来运行费时的任务并更新GUI. #doInBackground():T //执行任务并返回T类型的结果 #done():void //结束doInBackground之后执行事件分发线程…
创建任务和线程 任务就是对象,为了创建任务,必须首先为任务定义一个类.任务类必须实现Runnable接口.Runnable接口非常简单,它只有一个run方法.需要实现这个方法来告诉系统线程将如何运行. 任务必须在线程中执行.Thread类包括创建线程的构造方法以及控制线程的很多有用的方法. +Thread() 创建一个空线程 +Thread(task:Runnable) 为指定任务创建一个线程 +start():void 启动线程使方法run()被JVM调用 +isAlive():boolean…
Java并发编程:线程间协作的两种方式:wait.notify.notifyAll和Condition 在前面我们将了很多关于同步的问题,然而在现实中,需要线程之间的协作.比如说最经典的生产者-消费者模型:当队列满时,生产者需要等待队列有空间才能继续往里面放入商品,而在等待的期间内,生产者必须释放对临界资源(即队列)的占用权.因为生产者如果不释放对临界资源的占用权,那么消费者就无法消费队列中的商品,就不会让队列有空间,那么生产者就会一直无限等待下去.因此,一般情况下,当队列满时,会让生产者交出对…
横看成岭侧成峰,远近高低各不同.不识庐山真面目,只缘身在此山中. --苏轼 这一块儿学的是云里雾里,咱们先从简单的入手.逐渐的拨开迷雾见太阳.本次先做List集合的三个实现类的学习笔记 List特点:有序,元素可重复.其实它的本质就是一个线性表(下面会说到) 先上图,Java集合有Collection体系和Map体系: 然后简单介绍一下数据结构和算法: 数据结构就是数据和数据之间的关系,好比分子结构,晶体结构.碳原子按照一定的方式组合在一起形成碳分子,碳分子再按照一定方式形成晶体. 算法是对解题…
桃李春风一杯酒,江湖夜雨十年灯 --寄黄几复 之前图上写错了,是Hashtable类.t是小写的,它是个很古老的类,以至于命名都没有那么规范.. HashMap HashMap就是存储key-value键值对的集合,是一种映射关系.key中的元素组成了一个Set集合(key无序,不允许重复,可以是null),且任意key中的元素有且只有一个value值与其对应(value值可以是null) 上代码: public class MapTest { public static void main(S…
Sruts 2工作流程: Struts 1中所有的Action都只有一个实例,该Action实例会被反复使用.通过上面Struts 2 的工作流程的红色字体部分我们可以清楚看到Struts 2中每个Action都会有多个实例,意思就是说每次处理一个请求时都会生成一个Action实例,这些实例彼此独立,处理完毕就会被销毁.因此Struts 1中的Action是线程不安全的,Struts 2中的Action是线程安全的.由于Action中没有其他特殊资源,使用完毕就会被销毁,不会造成资源占用等的浪费…
江南好,何处异京华. 香散翠帘多在水,绿残红叶胜于花.无事避风沙. --<纳兰词> 诗词再好,大图不能忘 上大图: 先说说栈和队列: 栈就好比手枪的弹匣,你往里面压入子弹,最先压入的子弹就到了弹匣最底部的位置,最后压入的子弹在弹匣顶部.发射子弹的时候每次将弹匣顶部的子弹弹出发射.无法越过顶部子弹发射下面的子弹. 栈(stack)是限定仅在表尾进行插入和删除操作的线性表,LIFO 队列就跟上学那会儿排队打饭一样,但是不能加塞儿. 队列(queue)是只允许在队列一端进行插入操作,另一端进行删除操…
转自(http://blog.csdn.net/jerrying0203/article/details/45563947) 本文学习并总结java多线程与线程间通信的原理和方法,内容涉及java线程的众多常见重要知识点,学习后会对java多线程概念及线程间通信方式有直观清晰的了解和掌握,可以编写并分析简单的多线程程序. 进程与线程 进程:是一个正在执行的程序. 每一个进程执行都有执行顺序,一个执行顺序是一个执行路径,或者叫控制单元; 每一个程序启动时,都会在内存中分配一片空间,进程就用于标识这…