一、 java并发编程基础
1.1 程序、进程和线程
1.程序是静态的概念,是一组指令的集合,是永久的。可以比作是电影的胶片。
2.进程是动态的概念,是程序及其数据在计算机上的一次执行,有创建到消亡的生命周期。可以比作是一次胶片放映的过程。一个程序可以被多个进程执行,一个进程也可以执行多个程序。
单道程序具有封闭性(所谓封闭性就是程序一旦运行,结果就只取决于程序本身,后面我们还会看到,
线程封闭可以作为一种线程安全的技巧应用到多线程中),顺序性和可再现性(可再现性指程序在同一数据集上执行结果总是一样的)。为了提高计算机系统内各种资源的使用效率,引入了多道程序设计,多道程序主要体现在(1)资源共享和(2)并发性上面,后面几篇我会不断强调就是因为这两个特性才可能导致线程不安全,破坏任意特性都可以保证多线程的安全性。多道程序不再具有封闭性和再现性。
进程通常由三部分组成,程序、数据集合和进程控制块(PCB, process control block)。Pcb是进程动态特性的集中表现,主要包含进程调度信息和现场信息,调度信息包括进程名,进程号,优先级等;现场信息主要包含程序状态字,时钟寄存器等。总之,每个进程都有自己独立的代码和数据空间,独立的程序计数器等上下文环境,进程切换的开销是比较大的。
操作系统依据进程控制块对进程控制和管理。
操作系统中往往设计一些能完成特定功能且不可中断的过程。这些不可中断的过程称为
原语。用于控制进程的原语有:
1)创建原语。为一个程序分配一个工作区和建立一个进程控制块,并置该进程为就绪状态。
2)撤销原语。一个进程完成工作后,收回它的工作区和进程控制块。
3)阻塞原语。进程运行过程中发生等待事件时,把进程状态改为等待态。
4)唤醒原语。当进程等待的事件发生时,把进程的状态改为就绪态。
创建一个进程大体分为以下几步:
1) 申请一个空白的PCB和唯一的进程号pid
2) 为新进程分配除CPU以外的资源,包括内存空间
3) 初始化PCB中的数据项
4) 将新进程的PCB插入系统的就绪队列
进程主要包括就绪,运行,阻塞三种状态,状态间可以转换:
3.线程是进程内的一个执行单元,也是进程内的可调度实体。一个线程是进程内的一个顺序控制流。一个程序至少有一个进程,一个进程至少有一个线程。
1)地址空间:进程具有自己独立的地址空间,线程共享进程的地址空间
2)资源拥有:进程是资源分配的基本单位,线程共享进程的资源
3)线程是CPU调度的基本单位,进程不是
4)线程和进程均可并发执行。线程的创建,通信和切换的开销比进程小很多,由此产生了线程。
线程本身不能独立运行,必须运行在进程中,使用进程的地址空间,每个线程拥有自己独立的程序计数器。
1.2 线程的创建
通常有三种方法创建线程(1)继承Thread类,重写run()方法。 (2)实现Runnable接口和run()方法,把实现体依附在Thread类上运行。(3)实现Callable接口,通过FutureTask依附在Thread上运行。后面后介绍后两者之间的区别。
这三种方法都是通过Thread类的start()方法启动的,自动执行run方法,显式的调用run()方法是不会启动一个线程的。
因为extends Thread实现线程会导致不能再继承其他类了,而implements Runnable还可以实现其他接口,所以一般都是采取实现Runnable接口(或Callable接口)来创建线程。步骤:
step1:实现接口
class MyThread implements Runnable
{
public void run()
{
...
}
}
step2:创建线程对象
MyThread runnable = new MyThread();
step3:将Runnable对象关联到Thread
Thread thread = new Thread(runnable);
step4:启动线程
thread.start();
Jdk5.0开始提供了线程池api,可以通过工厂类Executors创建ExecutorService类型的线程池,然后调用execute(Runnbale target)方法执行线程体,最后调用shutdown()方法结束线程调用,一般服务器都需要线程池,如web服务器,ftp服务器。
上述线程(池)的创建可以很方便的找到例子。
1.3 线程的基本控制
线程创建后可以调用start启动,根据线程任务的特性和线程之间的协调性要求,需要对线程进行控制。通常是通过调用Thread对象的方法实现的。主要有sleep(), suspend(),resume(), join(), interrupt() 和stop(),一般情况下方法的调用会导致线程状态的切换。
注意:stop(), suspend(),resume()三个方法不推荐使用,推荐使用Object对象的wait/notify方法。
原因讨论可以参考:
http://xiaohuabiao.blog.163.com/blog/static/138482182008111605814290/
(1) Thread.sleep()方法使当前线程暂停一段指定的时间。中断(interrupt)可以终止睡眠时间。
(2) Join()方法会让一个线程等待另一个线程执行终止(含义是:wait for this thread to die)。比如在t1线程中调用t2.join(),则t1线程会等待t2线程结束才开始运行自己的方法。也可以像sleep方法一样指定等待的时间。同样这个等待也可以被中断。
(3) 使用中断interruput取消线程。已经启动的线程isAlive()方法返回true。有三种方法可以终止线程1)run方法正常返回 2)意外终止 3)应用程序终止。Interrupt可以在线程执行任务结束之前取消线程,其实不是真正的停止线程。调用这个方法时线程自己会检测线程状态,只是设置isInterrupted标志为true, 不会中止后面的代码。但如果是线程在调用wait,sleep等方法时调用interrupt()则会中断这个等待并抛出InterruptedException异常,程序员可以根据异常终止线程的处理。
还可以参考:
http://polaris.blog.51cto.com/1146394/372146
(4) stop方法会强迫线程停止,但方法本身是不安全的,比如线程中的对象处在不一致的状态下。该方法已经废弃了。
- 大小: 5.6 KB
分享到:
相关推荐
JAVA并发编程艺术 高清pdf : 1.并发变成的挑战 2. java并发机制的底层实现原理 3. java 内存模型 4. java并发编程基础 5.java中的锁。。。。。。。
Java并发编程与高并发解决方案笔记-基础篇Java并发编程与高并发解决方案笔记-基础篇Java并发编程与高并发解决方案笔记-基础篇Java并发编程与高并发解决方案笔记Java并发编程与高并发解决方案笔记-基础篇-基础篇Java...
读书笔记-Java并发编程实战-基础篇
《Java并发编程的艺术》内容涵盖Java并发编程机制的底层实现原理、Java内存模型、Java并发编程基础、Java中的锁、并发容器和框架、原子类、并发工具类、线程池、Executor框架等主题,每个主题都做了深入的讲解,同时...
第1章 简介 1.1 并发简史 1.2 线程的优势 1.2.1 发挥多处理器的强大能力 1.2.2 建模的简单性 1.2.3 异步事件的简化处理 1.2.4 响应更灵敏的用户界面 1.3 线程带来的风险 1.3.1 安全性问题 1.3.2 活跃性...
《Java并发编程从入门到精通》作者结合自己10多年Java并发编程经验,详细介绍了Java并发编程的基础概念、工作原理、编程技巧和注意事项,对Java高性能高并发编程有极大的参考价值。 《Java并发编程从入门到精通》...
自从java创建以来就已经支持并发的理念,如线程和锁。这篇指南主要是为帮助java多线程开发人员理解并发的核心概念以及如何应用这些理念。...开发者通过这些基础的接口可以构建高并发、线程安全的java应用程序。
详细的讲述了并发、高并发、CPU Cache、CPU多级缓存、CPU多级缓存 - 缓存一致性(MESI)、CPU多级缓存-乱序执行优化、Java内存模型(Java Memory Model,JMM)、并发的优势和风险...等等图文并茂详解
Java并发编程常识.ppt,阿里大牛梁飞编写,非常实用,欢迎大家想学习
, 《Java并发编程的艺术》内容涵盖Java并发编程机制的底层实现原理、Java内存模型、Java并发编程基础、Java中的锁、并发容器和框架、原子类、并发工具类、线程池、Executor框架等主题,每个主题都做了深入的讲解,...
JAVA并发编程实践,对基础好的,这秘籍便可打通任督二脉,多线程开发小case的。
Java并发编程实战,本书从线程的基础知识,包括线程安全性,对象共享以及对象组合灯,到结构化并发编程,都提供了很详细的讲解。
<type-version>7.0</type-version> <type-storage>META-INF/weblogic-cmp-rdbms-jar.xml</type-storage> </persistence-use> </persistence> </entity-descriptor> <jndi-name>com.ejb.CatalogHome</jndi-name...
本书的读者是那些具有一定Java编程经验的程序员、希望了解Java SE 5,6在线程技术上的改进和新特性的程序员,以及Java和并发编程的爱好者。 目录 代码清单 序 第1章 介绍 1.1 并发的(非常)简短历史 1.2 线程的...
Java并发编程Xmind思维导图,思路更清晰。内容来自《Java并发编程的艺术》,包括并发机制底层原理、Java内存模型、Java并发编程基础、锁机制、线程池、并发工具类、原子操作类、并发容器和框架。纯手打,非诚勿扰。