`
lianpeng0011
  • 浏览: 9116 次
社区版块
存档分类
最新评论

java并发编程一

    博客分类:
  • java
 
阅读更多

基础知识

       线程的本质是机器执行的路径,是操作系统的最小执行单元,它完全是多任务操作系统之上的虚拟概念,从硬件角度来说每一个cup只有一条执行路径。成百上千个线程同时执行是操作系统调度的假象。

 

        每一个计算机程序,或每个进程,至少有一个线程,这个线程称为主线程,Java的主线程称为main thread。它以某个class类的main方法为起点。任何计算机程序都是由单一线程开始运行的。进程独享一个内存空间,进程中的线程共享这个内存空间,每个线程有单独的栈来存储数据。

 

并发编程的术语

        屏障(Barrier):屏障代表多个线程的集合点,需要所有的线程都到达该集合点后才能继续往下执行,因此先到达的线程会进入等待。

        条件变量(Condition Variable):条件变量是和某个锁(Lock)关联的变量,通常用于同步环境中,实现等待-唤醒机制。线程可以在拥有锁的情况下,等待某个条件变量;或者在拥有锁的前提下,唤醒一个或者全部正在等待某个条件变量的线程。

        条件变量也程事件变量(Event Variable)。

        临界区域(Critical Section):代表一个同步化的方法和代码块,所有线程必须串行的经过临界区域。本质上就是一个隐藏的锁获取和释放区域。

         锁(Lock):用于表示进入临界区域特定线程的访问权限。读写锁(Read/Write Lock)可以允许多个线程进行同时取得,只要它们同意都是进行“读”操作。

         监控器(Monitor): 该术语在不同的系统中代表的含义不同,可能代指Lock,也可能代指等待-唤醒机制

        互斥(Mutex):和Lock类似,它往往是跨进程的、基于操作系统级别的。

        信号量(Semaphore):线程可以等待一个或多个信号的计数,另一个线程则可以释放一个或多个信号的计数,当线程活的足够的计数后,停止等待。

 

 Java线程的创建和管理

 创建线程

 Java允许两种创建线程的风格

  1.   继承java.lang.Thread类,重写run方法
  2.   实现java.lang.Runable接口,并将起传给Thread的构造方法。

Thread对象本质上并不代表线程本身,而是一组与线程有关的方法和数据的封装。

Thread的构造函数有以下参数:

       name :   Thread的名称,默认Thread-N ,N是一个唯一的数字;

       Runable  target :新线程执行的指令列表,位于run()方法中

       ThreadGroup group : 新线程加入的线程组,默认与调用新线程构造方法的那个线程的线程组一致

       long  stackSize:新线程执行方法时,存放临时变量的栈大小。

 线程的生命周期方法

        new Thread() : 创建线程,在Java中,线程也是对象,因此它的对象是调用构造器完成的。线程被构造后即存在,但这是还没有进行执行,在这是其它线程可以和该线程进行交互,例如:设置优先级、线程守护和名称。

       start() : 启动线程,调用start()方法后,jvm中创建了一个新的线程,并且线程的isAlive()==true,等待系统调度进行执行。

      stop(): 终结线程,不能调用stop()方法来终结线程,它有缺陷,已经被弃用。

      sleep()/wait()/join()/suspend():线程等待, suspend()方法用来暂停线程,但是与stop()一样有缺陷,已经弃用。Thread.sleep()静态方法,可以让线程暂停一段时间,之后自动回复执行,sleep暂停时并不会释放锁。Object.wait()方法依赖于同步,不能单独进行使用,wait方法会释放对象持有的锁。

      notify()/notifyAll()/resume(): 线程恢复,notify()和notifyAll()用于唤醒调用wait()方法阻塞的线程,唤醒线程后,会尝试获取monitor。resume()用于恢复暂停的线程,有缺陷。

     清除:线程结束后,其Java对象扔可以访问,可以附带一些有价值的信息。如果Thread线程脱离作用域会被GC回收,回收可能带着系统资源的清理。

 

 线程的正确停止方式

设定标记位

 

public class MyThread implements Runnable {

    private volatile boolean flag = true;
    @Override
    public void run() {
        while ( flag )
            ;
        System.out.println( "Thread Interrupt" );
    }

    public static final void main( String[] arg ) throws Exception {
        MyThread myThread = new MyThread();
        Thread thread = new Thread( myThread );
        thread.start();
        System.out.println( "123" );
        TimeUnit.SECONDS.sleep( 5 );
        myThread.setFlag( false );
    }

    public void setFlag( boolean flag ) {
        this.flag = flag;
    }

    public boolean isFlag() {
        return flag;
    }
}
 利用中断

 

 调用该方法,可以让任何处于阻塞(Blocking)方法调用中的线程获得退出的机会。该方法有两个效应:

  1. 线程的阻塞方法(可能)会抛出InterruptedException,程序代码可以捕获此异常并退出
  2. 设置线程内部“已中断”标记为true,提示线程已经被中断。可以使用isInterrupted()方法来检查该标记。即使线程没有被Block,这个标记也会被设置
Thread t = new Thread() {
            public void run()
            {
                while ( !isInterrupted() )
                    ;
                System.out.println( "interrupted" );
            }
        };
        t.start();
        TimeUnit.SECONDS.sleep( 1 );
        t.interrupt();

 利用异常判断(针对出于阻塞状态的线程)

Thread t = new Thread() {
            public void run()
            {
                try
                {
                    TimeUnit.SECONDS.sleep( 3600 );
                }
                catch ( InterruptedException e )
                {
                    System.out.println( "interrupted" );
                }
            }
        };
        t.start();
        TimeUnit.SECONDS.sleep( 1 );
        t.interrupt();

    关于interrupt()方法,还需要注意:

  1. 如果线程在调用Object.wait()、join()、sleep()方法时被其它线程中断,其中断标记位会被清除,并接收到InterruptedException
  2. 如果线程在InterruptibleChannel上执行I/O时被其它线程中断,则通道被关闭,线程的中断标记位被设置,并接受到ClosedByInterruptException。 ServerSocketChannel、SocketChannel、FileChannel、DatagramChannel等都是可中断通道
  3. 如果线程在Selector上执行select操作时被中断,则线程的中断标记位被设置,并立即返回
 

 

分享到:
评论

相关推荐

    java并发编程实战源码,java并发编程实战pdf,Java

    《Java并发编程实战》是Java并发编程领域的一本经典著作,它深入浅出地介绍了如何在Java平台上进行高效的多线程编程。这本书的源码提供了丰富的示例,可以帮助读者更好地理解书中的理论知识并将其应用到实际项目中。...

    Java 并发编程实战.pdf

    综合来看,该书不仅适合于对Java并发编程感兴趣的初学者,同样也适合有经验的开发者,作为一本参考资料和实践指南,读者可以通过它来加深对Java并发特性的理解和应用。书中丰富的案例分析和代码示例将有助于读者更...

    java并发编程2

    Java并发编程是Java开发中的重要领域,特别是在多核处理器和分布式系统中,高效地利用并发可以极大地提升程序的性能和响应速度。以下是对标题和描述中所提及的几个知识点的详细解释: 1. **线程与并发** - **线程*...

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

    《Java并发编程实战》是一本深入探讨Java平台并发编程的权威指南。这本书旨在帮助开发者理解和掌握在Java环境中创建高效、可扩展且可靠的多线程应用程序的关键技术和实践。它涵盖了从基本概念到高级主题的广泛内容,...

    JAVA并发编程艺术 高清pdf

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

    java并发编程实战中文加英文版加源码

    JAVA并发编程实践中文版 英文版 原书源码 带书签 java_concurrency_in_practice.pdf 英文版还是不错的,但是中文版的译者典型的没有技术功底,介绍上说什么专家, 翻译的非常差劲,有些句子都不通顺,都不知道自己去...

    java并发编程内部分享PPT

    这份“java并发编程内部分享PPT”显然是一个深入探讨这一主题的资料,旨在帮助开发者理解并掌握Java并发编程的核心概念和技术。 在Java并发编程中,首先我们需要了解的基本概念是线程。线程是操作系统分配CPU时间的...

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

    《Java并发编程实战》是一本深入探讨Java平台并发编程的权威指南,由Tim Peierls等人与Brian Goetz合著,旨在帮助Java开发者理解和掌握在多线程环境中编写高效、安全的代码。这本书由拥有丰富经验的JDK并发大师及...

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

    综上所述,《Java并发编程实战》不仅涵盖了Java并发编程的基础知识和技术细节,还包含了丰富的实践经验和前瞻性的思考,是任何一位从事Java开发工作的程序员不可或缺的学习资源。无论是初学者还是有经验的开发者都能...

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

    《Java并发编程的艺术》这本书是Java开发者深入理解并发编程的重要参考书籍。这本书全面地介绍了Java平台上的并发和多线程编程技术,旨在帮助开发者解决在实际工作中遇到的并发问题,提高程序的性能和可伸缩性。 ...

    java并发编程书籍

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

    Java并发编程实践高清pdf及源码

    《Java并发编程实践》是一本深入探讨Java多线程编程的经典著作,由Brian Goetz、Tim Peierls、Joshua Bloch、Joseph Bowles和David Holmes等专家共同编写。这本书全面介绍了Java平台上的并发编程技术,是Java开发...

    java并发编程实践pdf笔记

    Java并发编程实践是Java开发中不可或缺的一个领域,它涉及到如何高效、正确地处理多线程环境中的任务。这本书的读书笔记涵盖了多个关键知识点,旨在帮助读者深入理解Java并发编程的核心概念。 1. **线程和进程的...

    JAVA并发编程艺术pdf版

    《JAVA并发编程艺术》是Java开发者深入理解和掌握并发编程的一本重要著作,它涵盖了Java并发领域的核心概念和技术。这本书详细阐述了如何在多线程环境下有效地编写高效、可靠的代码,对于提升Java程序员的技能水平...

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

    总的来说,《JAVA并发编程实践》是一本深度和广度兼备的并发编程指南,无论是初学者还是有经验的Java开发者,都能从中受益匪浅。通过学习这本书,你将能够有效地应对并发编程中的挑战,提升你的多线程编程能力。

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

    《Java并发编程从入门到精通》是一本专为Java开发者设计的深度学习并发编程的书籍。作者韩剑锋,凭借其12年的IT行业经验,曾担任多家IT公司的研发总监和技术总监,以其丰富的实战经验和深厚的理论知识,为读者提供了...

    Java并发编程书籍高清版

    文字版(1).pdf可能是《Java并发编程实践》的一个文字版本或修订版,可能包含了一些新的见解或更新的内容,以便读者随时掌握最新的并发编程知识。 这三本书籍结合在一起,为Java开发者提供了一个全面的并发编程学习...

    java并发编程与实践

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

    (PDF带目录)《Java 并发编程实战》,java并发实战,并发

    《Java 并发编程实战》是一本专注于Java并发编程的权威指南,对于任何希望深入了解Java多线程和并发控制机制的开发者来说,都是不可或缺的参考资料。这本书深入浅出地介绍了如何在Java环境中有效地管理和控制并发...

Global site tag (gtag.js) - Google Analytics