`
足至迹留
  • 浏览: 496928 次
  • 性别: 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并发编程的艺术

    根据提供的文件信息,我们可以推断出这本书主要关注的是Java并发编程的相关技术和理论。下面将从几个方面对这一主题进行深入探讨: ### Java并发编程的基本概念 #### 1. 并发与并行的区别 在讨论Java并发编程之前...

    Java 并发编程实战.pdf

    ### Java并发编程基础 - **并发与并行**:并发是指多个任务在同一时间段内被执行(但不一定同一时刻),而并行则是指多个任务同时执行。理解这两者的区别对于深入学习并发编程至关重要。 - **Java并发机制**:Java...

    13-Java并发编程学习宝典.zip

    Java并发编程是软件开发中的重要领域,特别是在大型系统和高并发场景中不可或缺。"13-Java并发编程学习宝典.zip" 包含了一系列关于Java并发编程的学习资源,旨在帮助开发者掌握多线程编程的核心技术和最佳实践。以下...

    JAVA并发编程艺术 高清pdf

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

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

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

    《java 并发编程实战高清PDF版》

    总之,《Java并发编程实战》是一本全面介绍Java并发编程的书籍,适合有一定Java基础并希望提升并发编程能力的开发者阅读。通过学习,你可以掌握解决并发问题的策略和技巧,编写出更加健壮和高效的多线程应用。

    java并发编程实战(英文版)

    ### Java并发编程实战知识点概述 #### 一、Java并发特性详解 在《Java并发编程实战》这本书中,作者深入浅出地介绍了Java 5.0和Java 6中新增的并发特性。这些特性旨在帮助开发者更高效、安全地编写多线程程序。书中...

    java并发编程内部分享PPT

    此外,Java并发编程还包括对并发容器的使用,如ArrayList、LinkedList、HashSet、HashMap等基础容器在并发环境下可能存在问题,Java提供了一些线程安全的容器,如Vector、HashTable以及java.util.concurrent包下的...

    java并发编程书籍

    Java并发编程是软件开发中的一个关键领域,尤其是在大型企业级应用和分布式系统中。通过学习相关的书籍,开发者可以深入理解如何有效地设计和实现高效的多线程应用程序,避免并发问题,如竞态条件、死锁、活锁等。...

    java 并发编程的艺术pdf清晰完整版 源码

    通过阅读《Java并发编程的艺术》这本书,开发者不仅可以掌握Java并发编程的基础知识,还能了解到一些高级特性和技巧,从而在实际开发中游刃有余。同时,附带的源码将有助于加深理解,提供实际操作的机会。

    Java并发编程实战华章专业开发者书库 (Tim Peierls 等 美Brian Goetz).pdf

    《Java并发编程实战》提供了深入浅出的指导,涵盖了从基础理论到高级技术的广泛内容。 第一部分介绍了并发编程的基础,包括线程安全性的概念,如何构建线程安全的类,以及Java平台提供的并发工具如线程、同步机制等...

    JAVA并发编程实践.pdf+高清版+目录 书籍源码

    《JAVA并发编程实践》这本书是Java开发者深入理解并发编程的重要参考资料。它涵盖了Java并发的核心概念、工具和最佳实践,旨在帮助读者在多线程环境下编写高效、安全的代码。 并发编程是现代软件开发中的关键技能,...

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

    首先,我们来探讨Java并发编程的基础概念。并发是指多个执行单元(线程或进程)在同一时间间隔内同时进行工作。在Java中,我们主要通过线程来实现并发。Java提供了多种创建和管理线程的方法,如Thread类、Runnable...

    java并发编程与实践

    "Java并发编程与实践"文档深入剖析了这一主题,旨在帮助开发者理解和掌握如何在Java环境中有效地实现并发。 并发是指在单个执行单元(如CPU)中同时执行两个或更多任务的能力。在Java中,这主要通过线程来实现,...

    Java并发编程实践.pdf

    #### 一、并发编程基础 ##### 1.1 并发与并行的区别 在Java并发编程中,首先需要理解“并发”(Concurrency)和“并行”(Parallelism)的区别。“并发”指的是多个任务在同一时间段内交替执行,而“并行”则指的是...

    Java并发编程从入门到精通(pdf)(附源码)

    本书首先会介绍Java并发编程的基础概念,包括线程的创建与管理、同步机制如synchronized关键字和Lock接口,以及如何避免常见的并发问题,如死锁、活锁和饥饿。这些基础知识是理解并发编程的基石,通过深入浅出的讲解...

    JAVA并发编程实践 中文 高清 带书签 完整版 Doug Lea .pdf

    ### 一、Java并发编程基础 #### 1.1 并发与并行的概念 - **并发**:指多个事件在同一时间段内发生。 - **并行**:指多个事件在同一时刻发生。 在Java并发编程中,通常会涉及多个线程共享资源并同时运行的情况,...

Global site tag (gtag.js) - Google Analytics