`
足至迹留
  • 浏览: 486341 次
  • 性别: Icon_minigender_1
  • 来自: OnePiece
社区版块
存档分类
最新评论

<基础-1> java并发编程基础

阅读更多
一、 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
0
0
分享到:
评论

相关推荐

    JAVA并发编程艺术 高清pdf

    JAVA并发编程艺术 高清pdf : 1.并发变成的挑战 2. java并发机制的底层实现原理 3. java 内存模型 4. java并发编程基础 5.java中的锁。。。。。。。

    Java并发编程与高并发解决.zip

    Java并发编程与高并发解决方案笔记-基础篇Java并发编程与高并发解决方案笔记-基础篇Java并发编程与高并发解决方案笔记-基础篇Java并发编程与高并发解决方案笔记Java并发编程与高并发解决方案笔记-基础篇-基础篇Java...

    读书笔记-Java并发编程实战-基础篇

    读书笔记-Java并发编程实战-基础篇

    《Java并发编程的艺术》

    《Java并发编程的艺术》内容涵盖Java并发编程机制的底层实现原理、Java内存模型、Java并发编程基础、Java中的锁、并发容器和框架、原子类、并发工具类、线程池、Executor框架等主题,每个主题都做了深入的讲解,同时...

    Java并发编程实战

    第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并发编程从入门到精通

    《Java并发编程从入门到精通》作者结合自己10多年Java并发编程经验,详细介绍了Java并发编程的基础概念、工作原理、编程技巧和注意事项,对Java高性能高并发编程有极大的参考价值。 《Java并发编程从入门到精通》...

    Java 并发核心编程

    自从java创建以来就已经支持并发的理念,如线程和锁。这篇指南主要是为帮助java多线程开发人员理解并发的核心概念以及如何应用这些理念。...开发者通过这些基础的接口可以构建高并发、线程安全的java应用程序。

    01 - Java并发编程与高并发解决方案笔记-基础篇

    详细的讲述了并发、高并发、CPU Cache、CPU多级缓存、CPU多级缓存 - 缓存一致性(MESI)、CPU多级缓存-乱序执行优化、Java内存模型(Java Memory Model,JMM)、并发的优势和风险...等等图文并茂详解

    Java并发编程常识-梁飞.rar

    Java并发编程常识.ppt,阿里大牛梁飞编写,非常实用,欢迎大家想学习

    Java并发编程的艺术

    , 《Java并发编程的艺术》内容涵盖Java并发编程机制的底层实现原理、Java内存模型、Java并发编程基础、Java中的锁、并发容器和框架、原子类、并发工具类、线程池、Executor框架等主题,每个主题都做了深入的讲解,...

    JAVA并发编程实践

    JAVA并发编程实践,对基础好的,这秘籍便可打通任督二脉,多线程开发小case的。

    JAVA 并发编程实战

    Java并发编程实战,本书从线程的基础知识,包括线程安全性,对象共享以及对象组合灯,到结构化并发编程,都提供了很详细的讲解。

    java面试800题

    &lt;type-version&gt;7.0&lt;/type-version&gt; &lt;type-storage&gt;META-INF/weblogic-cmp-rdbms-jar.xml&lt;/type-storage&gt; &lt;/persistence-use&gt; &lt;/persistence&gt; &lt;/entity-descriptor&gt; &lt;jndi-name&gt;com.ejb.CatalogHome&lt;/jndi-name...

    Java并发编程实践 PDF 高清版

    本书的读者是那些具有一定Java编程经验的程序员、希望了解Java SE 5,6在线程技术上的改进和新特性的程序员,以及Java和并发编程的爱好者。 目录 代码清单 序 第1章 介绍 1.1 并发的(非常)简短历史 1.2 线程的...

    Java并发编程Xmind思维导图

    Java并发编程Xmind思维导图,思路更清晰。内容来自《Java并发编程的艺术》,包括并发机制底层原理、Java内存模型、Java并发编程基础、锁机制、线程池、并发工具类、原子操作类、并发容器和框架。纯手打,非诚勿扰。

Global site tag (gtag.js) - Google Analytics