随笔分类 - # Java多线程
1
摘要:前面我们介绍了2种同步机制: 1)使用synchronized关键字 2)使用Lock接口及其实现类: ReentrantLock,ReentrantReadWriteLock.ReadLock, and ReentrantReadWriteLock.WriteLock 本例中,我们将学习更高级的同
阅读全文
摘要:一个锁可能关联了一个或多个条件。这些条件可以在Condition接口中声名。 使用这些条件的目的是去控制一个锁并且可以检查一个条件是true或false,如果为false,则暂停直到 另一个线程来唤醒它。 Condition接口提供了这样一个机制 去暂定一个线程和唤醒一个暂停中的线程。 本例中继续拿
阅读全文
摘要:ReentrantLock和ReentrantReadWriteLock类的构造函数可接受一个布尔类型参数fair,表示你可以控制这2个类的行为。 其默认值为false,代表non-fair(不公平)模式。这种模式下,如果有多个线程等待获得锁并且只能有一个线程获得,上面2个锁类会无条件选择一个。(也
阅读全文
摘要:锁机制带来的最有意义的改进是提供了ReadWriteLock接口及其实现类ReentrantReadWriteLock。 这个类有2个锁,一个针对读操作另一个针对写操作。 可以有多个线程使用读操作,但是只有一个线程使用写操作。 当一个线程做写操作时,不能有任何线程做读操作。 本例中,我们将学习如何通
阅读全文
摘要:Java提供另一机制去同步代码块。它比synchronized关键字更强大且易用。 它是基于Lock接口和其实现类例如:ReentrantLock。 这一机制对比synchronized关键字的优势在于: 1.可以构建更加灵活的同步代码块; 2.Lock接口提供了一些额外功能,例如tryLock()
阅读全文
摘要:并发编程中有个经典问题: 生产消费者问题。 我们有一个数据缓冲区,一个或多个生产者往其中存入对象,另外一个或多个消费者从中取走。 因此,该数据缓冲区是一个共享数据结构,我们需要对其添加读取同步机制,但是我们还需要一些限制。 如果缓冲区满了,生产者不能继续向其中写入;反过来如果缓冲区空了,消费者也不能
阅读全文
摘要:当你使用synchronized关键字去保护一个代码块时,你必须传入一个对象的引用。 正常来讲,你讲使用this关键字去引用执行这个方法的对象,但是你可以使用其他对象的引用。 通常的,这些对象将会是专有的。例如,如果多个线程共享一个类中有2个独立的属性,你必须对每个变量做读取同步操作,但是如果一个线
阅读全文
摘要:使用synchronized关键字去控制对某个方法的并发调用。 某一时段内,只能有一个线程可以读取该方法。 其他线程需要等待前面线程调用完毕后方可调用。 不过,静态方法有着不同的行为。 虽然也是每次只能有一个线程调用它,但是另一个线程可以调用该类对象的其他非静态方法。 这一点需要注意,因为如果2个线
阅读全文
摘要:工厂模式是面向对象编程世界中最有用的设计模式。 它是一个创新型的模式,目标是开发一个对象,这个对象的任务是去创建其他类对象。这样一来,如果我们想创建某些类的对象就不需要使用new关键字。好处有以下几点: 1.容易改变对象的类或者创建这些对象的方式; 2.容易限制所创建的对象。例如,我们只能创建N个某
阅读全文
摘要:第8个例子讲了如何在线程中捕捉未检查异常,本例将介绍如何在线程组中处理未检查异常。 Task.java package com.dylan.thread.ch1.c11.task; import java.util.Random; /** * Class that implements the co
阅读全文
摘要:并发API提供的一个有趣功能是可以将多个线程组成一个组。 这样我们就能将这一组线程看做一个单元并且提供改组内线程对象的读取操作。例如你有一些线程在执行同样的任务并且你想控制他们,不考虑有多少个线程仍在运行,一个打断动作将会打断所有组内线程的执行。 Java提供了一个ThreadGroup类来表示一组
阅读全文
摘要:并发程序一个重要方面就是共享数据。 这一点在继承了Thread类或实现了Runnable接口的对象中有着特殊的重要性。 如果你创建了一个实现了Runnable接口的类对象并且用这个对象开启了N个线程对象,那么所有这些线程对象共享同样的属性。这意味着,如果你再某一线程中修改了属性值,所有其他线程将都能
阅读全文
摘要:java中有两类异常: 已检查异常:这类异常编译器要求开发者必须在代码中通过throws去处理。 例如:IOException和ClassNotFoundException。 未检查异常:不必显式的在代码重处理。例如:NumberFormatException。所有派生自Error和RuntimeE
阅读全文
摘要:Java有一种特殊线程叫守护(后台)线程。 1.这类线程拥有非常低的优先级且通常只是在没有其他线程运行的情况下执行。 2.其通常作为无线循环服务去执行某项任务。 3.不能让他们去执行重要任务因为你不知道他们什么时候获得CPU时间或者何时运行结束。 4.一个很典型的案例就是Java的垃圾收集器。 本例
阅读全文
摘要:有时我们需要等到某个线程执行完毕。例如,我可能有一个线程来初始化资源完毕然后其他线程才能开始执行。 谓词,我们可以使用Thread类的join()方法。 本例中,我们将学习使用这个方法。 DataSourcesLoader.java package com.dylan.thread.ch1.c06;
阅读全文
摘要:有时候我们需要让线程在一段时间内不做任何事。例如某线程每个一小时检测一下传感器,剩余的时间不做任何事。 我们可以使用sleep()方法使线程睡眠,此期间不占用计算机资源。 这个方法接受一个整数表示睡眠的毫秒数。 睡眠结束后,JVM将从新分配其CPU时间。另一种睡眠方式是使用TimeUnit枚举元素的
阅读全文
摘要:Java提供了InterruptedException异常,当我们检测到线程被打断时可以抛出并在run()方法中进行捕捉。 本例中,我们将开发一个程序以实现根据文件名称在指定文件夹(包括其子目录)中搜索它。 以此来介绍如何使用InterruptedException异常。 FileSearch.ja
阅读全文
摘要:一般来讲一个java程序如果运行着多个线程,那么只有在这些线程都运行完毕后才会终止。 但有时候,我们需要去结束某个线程或者取消某个任务。此时就用到了Java线程的打断机制,即interruption。 本例中,我们将开发一个程序创建线程,5秒后将强制打断它。 PrimeGenerator.java
阅读全文
摘要:常用线程属性 ID: 每个线程的唯一标识; Name: 线程名称; Priority: 线程优先级,从1-10,数字越大优先级越高;不推荐改变线程优先级; Status: 线程状态,包含6种状态:new, runnable, blocked, waiting, time waiting, termi
阅读全文
摘要:从这一篇开始写Java并发编程实例,内容都翻译整理自书籍:《Java 7 Concurrency Cookbook》 谈到线程,无法逃避的一个问题就是: 并发(concurrency)和并行(parallellism)区别: 解释一:并发是指两个或多个事件在同一时间间隔发生;并行是指两个或者多个事件
阅读全文
1