`

java 并发整理

 
阅读更多

转: http://www.iteye.com/magazines/131-Java-Concurrency

 

使用Sleep方法暂停一个线程 

在Thread中有两个不同的sleep()方法,一个使用毫秒表示休眠的时间,而另一个是用纳秒。由于操作系统的限制休眠时间并不能保证十分精确。休眠周期可以被interrups所终止,我们将在后面看到这样的例子。不管在任何情况下,我们都不应该假定调用了sleep()方法就可以将一个线程暂停一个十分精确的时间周期。 

 

中断(Interrupts) 
中断是给线程的一个指示,告诉它应该停止正在做的事并去做其他事情。一个线程究竟要怎么响应中断请求取决于程序员,不过让其终止是很普遍的做法。

一个线程通过调用对被中断线程的Thread对象的interrupt()方法,发送中断信号。为了让中断机制正常工作,被中断的线程必须支持它自己的中断(即要自己处理中断) 

 

如果一个线程长时间运行而不调用会抛InterruptedException异常的方法会怎样? 那它必须周期性地调用Thread.interrupted()方法,该方法在接收到中断请求后返回true。例如: 

 

  1. for (int i = 0; i < inputs.length; i++) {  
  2.     heavyCrunch(inputs[i]);  
  3.     if (Thread.interrupted()) {  
  4.         // We've been interrupted: no more crunching.  
  5.         return;  
  6.     }  
  7. }  

 

 

 

 

 

Join
Join()方法可以让一个线程等待另一个线程执行完成。

将会使当前线程暂停执行并等待t执行完成。重载的join()方法可以让开发者自定义等待周期。然而,和sleep()方法一样join()方法依赖于操作系统的时间处理机制,你不能假定join()方法将会精确的等待你所定义的时长。 
如同sleep()方法,join()方法响应中断并在中断时抛出InterruptedException。 

 

 

一个简单的线程例子 

下面这个简单的例子将会把这一节的一些概念放到一起演示。SimpleThreads程序有两个线程组成,第一个是主线程,它从创建了一个线程并等待它执行完成。如果MessageLoop线程执行了太长时间,主线程将会将其中断。 
MessageLoop现场将会打印一系列的信息。如果中断在它打印完所有信息前发生,它将会打印一个特定的消息并退出。 

 

 

  1. public class SimpleThreads {  
  2.   
  3.     // Display a message, preceded by  
  4.     // the name of the current thread  
  5.     static void threadMessage(String message) {  
  6.         String threadName =  
  7.             Thread.currentThread().getName();  
  8.         System.out.format("%s: %s%n",  
  9.                           threadName,  
  10.                           message);  
  11.     }  
  12.   
  13.     private static class MessageLoop  
  14.         implements Runnable {  
  15.         public void run() {  
  16.             String importantInfo[] = {  
  17.                 "Mares eat oats",  
  18.                 "Does eat oats",  
  19.                 "Little lambs eat ivy",  
  20.                 "A kid will eat ivy too"  
  21.             };  
  22.             try {  
  23.                 for (int i = 0;  
  24.                      i < importantInfo.length;  
  25.                      i++) {  
  26.                     // Pause for 4 seconds  
  27.                     Thread.sleep(4000);  
  28.                     // Print a message  
  29.                     threadMessage(importantInfo[i]);  
  30.                 }  
  31.             } catch (InterruptedException e) {  
  32.                 threadMessage("I wasn't done!");  
  33.             }  
  34.         }  
  35.     }  
  36.   
  37.     public static void main(String args[])  
  38.         throws InterruptedException {  
  39.   
  40.         // Delay, in milliseconds before  
  41.         // we interrupt MessageLoop  
  42.         // thread (default one hour).  
  43.         long patience = 1000 * 60 * 60;  
  44.   
  45.         // If command line argument  
  46.         // present, gives patience  
  47.         // in seconds.  
  48.         if (args.length > 0) {  
  49.             try {  
  50.                 patience = Long.parseLong(args[0]) * 1000;  
  51.             } catch (NumberFormatException e) {  
  52.                 System.err.println("Argument must be an integer.");  
  53.                 System.exit(1);  
  54.             }  
  55.         }  
  56.   
  57.         threadMessage("Starting MessageLoop thread");  
  58.         long startTime = System.currentTimeMillis();  
  59.         Thread t = new Thread(new MessageLoop());  
  60.         t.start();  
  61.   
  62.         threadMessage("Waiting for MessageLoop thread to finish");  
  63.         // loop until MessageLoop  
  64.         // thread exits  
  65.         while (t.isAlive()) {  
  66.             threadMessage("Still waiting...");  
  67.             // Wait maximum of 1 second  
  68.             // for MessageLoop thread  
  69.             // to finish.  
  70.             t.join(1000);  
  71.             if (((System.currentTimeMillis() - startTime) > patience)  
  72.                   && t.isAlive()) {  
  73.                 threadMessage("Tired of waiting!");  
  74.                 t.interrupt();  
  75.                 // Shouldn't be long now  
  76.                 // -- wait indefinitely  
  77.                 t.join();  
  78.             }  
  79.         }  
  80.         threadMessage("Finally!");  
  81.     }  
  82. }  

 

 

 

 

分享到:
评论

相关推荐

    java并发整理

    ### Java并发核心知识点详解 #### 一、Java并发基础概念 **并发简介**: Java并发是指在一个程序中同时运行多个线程的能力。每个Java程序至少包含一个线程,即启动时运行在`main`方法中的主线程。此外,在Java...

    Java并发框架整理

    ### Java并发框架整理 #### 多线程从1.2到1.7各种接口使用及场景介绍 在Java中,多线程技术是一项非常重要的功能,它可以极大地提高应用程序的性能和响应能力。从JDK 1.2版本开始,Java就提供了支持多线程的基础...

    并发相关书籍整理 高质量

    这五本书籍,包括《JAVA并发编程 核心方法与框架》、《Java并发编程:设计原则与模式(第二版)》、《Java并发编程实战(中文版)》、《Java多线程编程核心技术_完整版》以及《Java多线程编程实战指南 设计模式篇》...

    JAVA并发[整理].pdf

    JAVA并发[整理].pdf

    Java并发编程面试题--共87题

    不管你是新程序员还是...注:本文档根据http://www.importnew.com/12773.html 和http://ifeve.com/java-multi-threading-concurrency-interview-questions-with-answers/ 这两个网站的并发编程试题集整理得到的文档,

    JAVA核心知识点整理.zip

    "JAVA核心知识点整理.zip"这个压缩包文件包含了对Java进阶学习的重要知识点的详细概述,主要集中在PDF文档"JAVA核心知识点整理.pdf"中。以下是这份资料可能涵盖的主要内容: 1. **Java基础**:首先,你会学到Java的...

    《实战java高并发程序设计》源码整理

    《实战Java高并发程序设计》是一本深入探讨Java并发编程的书籍,其源码整理包含了大量实际示例和实践案例,旨在帮助读者更好地理解和掌握Java并发处理的核心技术。在这个压缩包中,"src"文件夹很可能是存放了书中...

    Java并发编程面试题整理150问

    Java并发编程是Java开发者在面试中常常遇到的重要领域,它涉及到多线程、同步机制、内存模型等多个方面。以下是对一些关键知识点的详细解释: 1. **线程与程序性能**: - 并发并不意味着多线程,启动过多线程可能...

    java笔记整理(超详细) java笔记整理(超详细)

    - Java内建了多线程机制,通过`Thread`类或实现`Runnable`接口可以创建和管理线程,实现并发执行。 4. **集合框架**: - `Collection`接口是所有集合类的根接口,分为`List`和`Set`两大分支。 - `List`接口包括`...

    java并发编程实战源码-concurrent-programming:《Java并发编程实战》源码整理

    源码整理集合`concurrent-programming-master`提供了书中示例代码,对于学习和理解Java并发编程的概念、工具和最佳实践非常有帮助。 在Java并发编程中,以下几个核心知识点至关重要: 1. **线程与进程**:线程是...

    java并发编程-超级大全整理

    总结,Java并发编程涵盖了大量的概念和技术,包括线程的创建、同步、通信以及并发工具的使用。理解和掌握这些知识点,是成为一名合格的Java并发程序员的基础。在实际开发中,应结合具体场景选择合适的并发策略,以...

    【Java高并】Java高并发秒杀API之业务分析与DAO层源码和整理的笔记seckill是项目源码note是整理的笔记.zip

    Java高并发秒杀API之业务分析与DAO层源码和整理的笔记seckill是项目源码note是整理的笔记.zip Java高并发秒杀API之业务分析与DAO层源码和整理的笔记seckill是项目源码note是整理的笔记.zip Java高并发秒杀API之业务...

    BIO,NIO,AIO,Netty面试题 35道.pdfJava并发编程最全面试题 123道.pdfJava并发编程面试题

    Java并发编程最全面试题 123道.pdf Java并发编程面试题 75题.pdf JAVA核心面试知识点整理.pdf Java垃圾收集必备手册.pdf Java虚拟机(JVM)面试题 51道.pdf SpringBoot面试题 30道.pdf Spring面试题(含答案).pdf ...

    Java并发面试题整理(答案).docx

    以上就是关于 Java 并发编程的一些核心知识点,包括并发编程的三要素、线程的状态流转、创建线程的方式、线程同步机制等,这些都是在面试中常见的问题,理解和掌握这些知识对于成为一名优秀的 Java 并发程序员至关...

    Android面试整理之java基础并发编程思维脑图

    囊括了Android面试中的java多线程知识,包括线程的基础、threadLoca|、并发编程中的锁 JMM synchronized关键字 以及部分垃圾回收机制

    Java并发编程的艺术1

    《Java并发编程的艺术1》是一本专注于Java并发编程的书籍,由方腾飞、魏鹏和程晓明合著。本书的初衷是作者在2012年通过写作并发编程相关文章,尤其是对volatile关键字深入分析的经验,进而形成了一套系统的并发编程...

    JAVA面试整理,吐血整理

    在给定文件的内容中,我们可以提取出关于Java面试的多个重要知识点,以下是针对提供的部分内容的详细知识点: 1. Java的“无关性”特性: - Java的宣传口号“Write once, run anywhere”体现了Java的平台无关性,...

    java 并发编程、java虚拟机学习

    根据提供的文件标题、描述以及部分具体内容,我们可以提炼出与Java并发编程及Java虚拟机相关的多个重要知识点。下面将对这些知识点进行详细的阐述。 ### Java并发编程基础 #### 1. 并发与并行的区别 - **并发**指...

    java并发编程总结

    讲java并发编程做了一个整理,可以帮助理清一些概念,帮助理解

    JAVA并发编程实践-

    根据提供的信息,我们可以...以上就是根据给定的信息整理出来的关于Java并发编程实践的相关知识点。这些内容覆盖了从基本概念到高级应用的多个方面,对于希望深入学习Java并发编程的开发者来说是非常有价值的参考资料。

Global site tag (gtag.js) - Google Analytics