标签 ‘ classes

定制并发类(九)实现一个自定义的Lock类

声明:本文是《 Java 7 Concurrency Cookbook 》的第七章,作者: Javier Fernández González     译者:许巧辉

实现一个自定义的Lock类

锁是Java并发API提供的基本同步机制之一。它允许程序员保护代码的临界区,所以,在某个时刻只有一个线程能执行这个代码块。它提供以下两种操作:

  • lock():当你想要访问一个临界区时,调用这个方法。如果有其他线程正在运行这个临界区,其他线程将阻塞,直到它们被这个锁唤醒,从而获取这个临界区的访问。
  • unlock():你在临界区的尾部调用这个方法,允许其他线程访问这个临界区。

在Java并发API中,锁是在Lock接口及其一些实现类中声明的,比如ReentrantLock类。

在这个指南中,你将学习如何实现你自己的Lock对象,它将实现一个实现了Lock接口并可用来保护临界区的类。

阅读全文

定制并发类(七)实现ThreadFactory接口生成自定义的线程给Fork/Join框架

声明:本文是《 Java 7 Concurrency Cookbook 》的第七章,作者: Javier Fernández González     译者:许巧辉

实现ThreadFactory接口生成自定义的线程给Fork/Join框架

Fork/Join框架是Java7中最有趣的特征之一。它是Executor和ExecutorService接口的一个实现,允许你执行Callable和Runnable任务而不用管理这些执行线程。

这个执行者面向执行能被拆分成更小部分的任务。主要组件如下:

  • 一个特殊任务,实现ForkJoinTask类
  • 两种操作,将任务划分成子任务的fork操作和等待这些子任务结束的join操作
  • 一个算法,优化池中线程的使用的work-stealing算法。当一个任务正在等待它的子任务(结束)时,它的执行线程将执行其他任务(等待执行的任务)。

ForkJoinPool类是Fork/Join的主要类。在它的内部实现,有如下两种元素:

  • 一个存储等待执行任务的列队。
  • 一个执行任务的线程池

在这个指南中,你将学习如何实现一个在ForkJoinPool类中使用的自定义的工作者线程,及如何使用一个工厂来使用它。
阅读全文

定制并发类(五)在一个Executor对象中使用我们的ThreadFactory

声明:本文是《 Java 7 Concurrency Cookbook 》的第七章,作者: Javier Fernández González     译者:许巧辉

在一个Executor对象中使用我们的ThreadFactory

在前面的指南中,实现ThreadFactory接口生成自定义线程,我们引进了工厂模式和提供如何实现一个实现ThreadFactory接口的线程的工厂例子。

执行者框架(Executor framework)是一种机制,它允许你将线程的创建与执行分离。它是基于Executor、ExecutorService接口和实现这两个接口的ThreadPoolExecutor类。它有一个内部的线程池和提供一些方法,这些方法允许你提交两种任务给线程池执行。这两种任务是:

  • 实现Runnable接口的类,用来实现没有返回结果的任务
  • 实现Callable接口的类,用来实现有返回结果的任务

在执行者框架(Executor framework)的内部,它提供一个ThreadFactory接口来创建线程,这是用来产生新的线程。在这个指南中,你将学习如何实现你自己的线程类,用一个工厂来创建这个类的线程,及如何在执行者中使用这个工厂,所以这个执行者将执行你的线程。

阅读全文

定制并发类(四)实现ThreadFactory接口生成自定义的线程

声明:本文是《 Java 7 Concurrency Cookbook 》的第七章,作者: Javier Fernández González     译者:许巧辉

实现ThreadFactory接口生成自定义的线程

在面向对象编程的世界中,工厂模式(factory pattern)是一个被广泛使用的设计模式。它是一个创建模式,它的目的是开发一个类,这个类的使命是创建一个或多个类的对象。然后,当我们要创建一个类的一个对象时,我们使用这个工厂而不是使用new操作。

  • 使用这个工厂,我们集中对象的创建,获取容易改变创建对象的类的优势,或我们创建这些对象的方式,容易限制创建对象的有限资源。比如,我们只能有一个类型的N个对象,就很容易产生关于对象创建的统计数据。

Java提供ThreadFactory接口,用来实现一个Thread对象工厂。Java并发API的一些高级工具,如执行者框架(Executor framework)或Fork/Join框架(Fork/Join framework),使用线程工厂创建线程。

在Java并发API中的其他工厂模式的例子是Executors类。它提供许多方法来创建不同类型的Executor对象。

在这个指南中,你将继承Thread类,以添加新功能,并且你将实现一个线程工厂来创建这个新类的线程。

阅读全文

定制并发类(三)实现一个基于优先级的Executor类

声明:本文是《 Java 7 Concurrency Cookbook 》的第七章,作者: Javier Fernández González     译者:许巧辉

实现一个基于优先级的Executor类

在Java并发API的第一个版本中,你必须创建和运行应用程序中的所有线程。在Java版本5中,随着执行者框架(Executor framework)的出现,对于并发任务的执行,一个新的机制被引进。

使用执行者框架(Executor framework),你只要实现你的任务并把它们提交给执行者。这个执行者负责执行你的任务的线程的创建和执行。

在内部,一个执行者使用一个阻塞队列来存储待处理任务。以任务到达执行者的顺序来存储。一个可能的替代就是使用一个优先级列队来存储新的任务。这样,如果一个高优先级的新任务到达执行者,它将比其他已经在等待一个线程来执行它们,且低优先级的任务先执行。

在这个指南中,你将学习如何实现一个执行者,它将使用优先级队列来存储你提交执行的任务。

阅读全文

定制并发类(二)定制ThreadPoolExecutor类

声明:本文是《 Java 7 Concurrency Cookbook 》的第七章,作者: Javier Fernández González     译者:许巧辉

定制ThreadPoolExecutor类

执行者框架(Executor framework)是一种机制,允许你将线程的创建与执行分离。它是基于Executor和ExecutorService接口及其实现这两个接口的ThreadPoolExecutor类。它有一个内部的线程池和提供允许你提交两种任务给线程池执行的方法。这些任务是:

  • Runnable接口,实现没有返回结果的任务
  • Callable接口,实现返回结果的任务

在这两种情况下,你只有提交任务给执行者。这个执行者使用线程池中的线程或创建一个新的线程来执行这些任务。执行者同样决定任务被执行的时刻。

在这个指南中,你将学习如何覆盖ThreadPoolExecutor类的一些方法,计算你在执行者中执行的任务的执行时间,并且将关于执行者完成它的执行的统计信息写入到控制台。

阅读全文

定制并发类(一)引言

声明:本文是《 Java 7 Concurrency Cookbook 》的第七章,作者: Javier Fernández González     译者:许巧辉 

在这个文章中,我们将包含:

引言

Java 并发API提供许多接口和类来实现并发应用程序。它们提供底层(low-level)机制,如Thread类、Runnable或Callable接口、或synchronized关键字。同样也提供高级(high-level)机制,如Executor框架和Java 7 发布的Fork/Join框架。尽管这样,你可能发现你自己开发一个程序时,没有一个java类能满足你的需求。
阅读全文

定制并发类(十一)实现自定义的原子对象

声明:本文是《 Java 7 Concurrency Cookbook 》的第七章,作者: Javier Fernández González     译者:许巧辉 校对:方腾飞

实现你自己的原子(atomic)对象

Java版本5中引入原子变量,并提供对单个变量的原子操作。当一个线程在原子变量上执行操作时,这个类的实现包含一种机制用来检查这个操作在一个步骤内完成。基本上,这个操作是先获取变量的值,然后在本地变量中改变这个值,最后尝试将旧值变成这个新值。如果旧值仍然是相同的,它将改变成新值,否则,这个方法重新开始这个操作。(校对注:这段话描述了CAS的实现原理 )

在这个指南中,你将学习如何继承一个原子对象和如何实现遵从原子对象机制的两个操作,来保证所有的操作在一个步骤内完成。 阅读全文

return top