第21章 并发

package booknote.chapter21_并发;

/**

* 一个线程就是在进程中的一个单一的顺序控制流

* web库的基本类Servlet具有天生的多线程性,因为web服务器经常包含多个处理器,而并发是充分利用这些处理器的理想方式

*/

public class ThreadNote {

/**

* 定义任务:一个public的内部类

* 当从Runnable导出一个类时,它必须具有run()方法,但是这个方法并无特殊之处,它不会产生任何内在的线程能力。

* 要实现线程行为,则必须显示地将一个任务附着到线程上 。

*/

public static class Liftoff implements Runnable{

protected int countDown = 10;

private static int taskCount = 0;

private final int id  = taskCount++;

public Liftoff(){

}

public Liftoff(int countDown){

this.countDown = countDown;

}

public String status(){

return "#"+id+"("+ (countDown>0?countDown:"Liftoff!")+")";

}

public void run(){

while(countDown-->0){

System.out.println(status());

/**

* 对静态方法Thread.yield()的调用时对线程调度器:

* java线程机制的一部分,可以将cpu从一个线程转移给另一个线程

* 相当于声明:我已经执行完生命周期中最重要的部分了,此刻正是切换给其他任务执行一段时间的大好时机

*/

Thread.yield();

}

}

}

/**

* 在main()线程中创建新定义的执行任务的线程

*/

public static void main(String[] args) {

for(int i=0;i<5;i++){

/**

* Thread构造器只需要一个Runnable对象。

* 调用Thread对象的start()方法为该线程执行必需的初始化操作,然后调用Runnable的run()方法,以便在新线程中启动该任务。

* Start()看起来是产生了一个对长期运行方法的调用,实际上产生的是对Liftoff.run()的方法调用,

* 就算这个方法还没有完成,但是因为Liftoff.run()是由不同的线程执行的,因此仍旧可以执行main()线程中的其他操作

* (任何线程都可以启动另一个线程),因此程序看起来会同时运行两个方法main(),Liftoff.run()

*/

/**

* 当main()创建Thread对象时,它并没有捕获任何对这些对象的引用。

* 在使用普通对象时,这对于垃圾回收来说是一场公平游戏,但是使用Thread时,情况会不同。

* 每个Thred都"注册了自己,因此确实有一个对它的引用,而且在它的任务退出其run()并死亡之前,垃圾回收器无法清除它。

* 因此,一个线程会创建一个单独的执行线程,在对start()的调用完成之后,它仍旧会继续存在。"

*/

new Thread(new Liftoff()).start();

System.out.println("waiting for liftoff!");

}

}

}

package booknote.chapter21_并发;

import java.util.concurrent.ExecutorService;

import java.util.concurrent.Executors;

import booknote.chapter21_并发.ThreadNote.Liftoff;

/**

* JAVA SE5的java.util.concurrent包中的执行器Executor用来管理Thread对象,从而简化并发编程。

* Executor在客户端和任务执行之间提供了一个间接层;与客户端直接执行任务不同,这个中介对象将执行任务。

* Executor允许你管理异步任务的执行,而无须显示地管理线程的生命周期。

*/

public class CachedThreadPool {

public static void main(String[] args) {

//ExecutorService对象是使用静态的Executor方法创建,这个方法可以确定其Executor类型

ExecutorService exec =Executors.newCachedThreadPool();

for(int i=0;i<5;i++){

exec.execute(new Liftoff());

}

exec.shutdown();

/**

* FixedThreadPool使用有限的线程集来执行所提交的任务,即一次性预先执行代价高昂的线程分配,因而就可以限制线程的数量了。

* 这样可以节省时间,因为你不用为每个任务都固定地付出创建线程的开销。

* 注意:在任何线程池中,现有线程在可能的情况下,都会被自动复用。

*

* CachedThreadPool在程序执行过程中通常会创建与所需数量相同的线程,然后在它回收旧线程时停止创建新线程,因此它是合理的

* Executor的首选。只有当这种方式会引发问题时,你才需要切换到FixedThreadPool

*/

ExecutorService exec2 =Executors.newFixedThreadPool(5);

for(int i=0;i<5;i++){

exec2.execute(new Liftoff());

}

exec2.shutdown();

}

}

时间: 2024-11-06 15:49:16

第21章 并发的相关文章

Java编程思想——第21章 并发(二)

三.共享受限资源 对于并发任务,你需要某种方式来防止两个任务访问相同的资源,至少在关键阶段不能出现这种情况. 1.解决共享资源竞争 防止这种冲突的方法就是当资源被一个任务使用时,在其上加锁.基本上所有的并发模式在解决线程冲突问题的时候,都是采用序列化访问共享资源的方案.通常这是通过在代码前面加上以挑锁语句来实现的,这使得在一段时间内只有一个任务可以运行这段代码.因为锁语句产生了一种互相排斥的效果,所以这种机制撑场成为互斥量(mutex). synchronized,当代码要执行被synchron

Java编程思想 第21章 并发

这是在2013年的笔记整理.现在重新拿出来,放在网上,重新总结下. 两种基本的线程实现方式 以及中断 package thread; /** * * @author zjf * @create_time 2013-12-18 * @use 测试基本的两种线程的实现方式 *         测试中断 */ public class BasicThreadTest { public static void main(String[] args) { Counter c1 = new Counter(

Java编程思想读书笔记--第21章并发

1.基本的线程机制 定义任务 public class LiftOff implements Runnable{ protected int countDown = 10; private static int taskCount = 0; private final int id = taskCount++; public LiftOff(){} public LiftOff(int countDown){ this.countDown = countDown; } public String

4.20日第13次作业.,20章战略管理,21章业务流程管理和重组,22章知识管理,高项,29-田哲琦

4.20日第13次作业.,20章战略管理,21章业务流程管理和重组,22章知识管理,高项,29-田哲琦 20章.战略管理1.企业战略的特点有哪些?P420-421 答:1).全局性 2).长远性 3).抗争性 4).纲领性 2.企业战略决策的特点有哪些?P421答:1).决策的对象是复杂的,很难把握住它的结构,并且是没有先例的,对其处理上也是没有经验可循. 2).面对的问题常常是突发性的.难以预料的.所依靠的是来自外部的关于未来如何变化的很少的情报. 3).决策的性质直接涉及到企业的前途. 4)

[CSAPP笔记][第十二章并发编程]

第十二章 并发编程 如果逻辑控制流在时间上是重叠,那么它们就是并发的(concurrent).这种常见的现象称为并发(concurrency). 硬件异常处理程序,进程和Unix信号处理程序都是大家熟悉的例子. 我们主要将并发看做是一种操作系统内核用来运行多个应用程序的机制. 但是,并发不仅仅局限于内核.它也可以在应用程序中扮演重要的角色. 例如 Unix信号处理程序如何允许应用响应异步事件 例如:用户键入ctrl-c 程序访问虚拟存储器的一个未定义的区域 其他情况 访问慢速I/O设备 当一个应

4.11日第11次作业,21章法律法规与标准,22章职业道德规范

4.11日第11次作业,21章法律法规与标准,22章职业道德规范 21章:法律法规和标准规范 22章:职业道德规范 1.中国标准划分为哪四个层次?要求最低的是哪个?P498 答:<中华人民共和国标准化法>将标准划分为4个层次:即国家标准.行业标准.地方标准和企业标准.其中国标最低,企业标准最高. 2.国家标准的制订程序包括哪些?P499中间 答:国家标准的制定有一套正常程序,每一个过程都要按部就班地完成,这个过程分为前期准备.立项.起草.征求意见.审查.批准.出版.复审和废止9个阶段. 3.I

第十二章 并发编程 学习笔记

第十二章 并发编程 进程是程序级并发,线程是函数级并发. 三种基本的构造并发程序的方法: 进程:每个逻辑控制流是个一个进程,由内核进行调度和维护. I/O多路复用:应用程序在一个进程的上下文中显式地调度他们自己的逻辑流. 线程:运行在单一进程上下文中的逻辑流,由内核进行调度. 12.1 基于进程的并发编程 构造并发程序最简单的方法就是用进程. 使用大家都很熟悉的函数例如: fork exec waitpid 关于在父.子进程间共享状态信息:共享文件表,但不共享用户地址空间. 进程又独立的地址空间

第十二章 并发编程

第十二章 并发编程 三种基本的构造并发程序 进程:每个逻辑控制流是一个进程,由内核进行调度,进程有独立的虚拟地址空间 I/O多路复用:逻辑流被模型化为状态机,所有流共享同一个地址空间 线程:运行在单一进程上下文中的逻辑流,由内核进行调度,共享同一个虚拟地址空间 常用函数: fork exec waitpid 基于I/O多路复用的并发事件驱动服务器 事件驱动程序:将逻辑流模型化为状态机. 状态机: 状态 输入事件 转移 对于状态机的理解,参考EDA课程中学习的状态转换图的画法和状态机. 整体的流程

【Android】第21章 2D图形和动画

分类:C#.Android.VS2015: 创建日期:2016-03-19 一.简介 Android系统定义了一系列独立的图形处理类,其中,2D图形处理类分别位于以下命名空间: Android.Graphices Android.Graphics.Drawable.Shapes Android.View.Animation 3D图形的处理类位于Android.Opengl命名空间下. 总体来说,Android的Graphics技术大致可以分为两大类:图形和动画. 图形又被进一步分为2D图形和3D