转: http://www.iteye.com/magazines/131-Java-Concurrency
使用Sleep方法暂停一个线程
在Thread中有两个不同的sleep()方法,一个使用毫秒表示休眠的时间,而另一个是用纳秒。由于操作系统的限制休眠时间并不能保证十分精确。休眠周期可以被interrups所终止,我们将在后面看到这样的例子。不管在任何情况下,我们都不应该假定调用了sleep()方法就可以将一个线程暂停一个十分精确的时间周期。
中断(Interrupts)
中断是给线程的一个指示,告诉它应该停止正在做的事并去做其他事情。一个线程究竟要怎么响应中断请求取决于程序员,不过让其终止是很普遍的做法。
一个线程通过调用对被中断线程的Thread对象的interrupt()方法,发送中断信号。为了让中断机制正常工作,被中断的线程必须支持它自己的中断(即要自己处理中断)
如果一个线程长时间运行而不调用会抛InterruptedException异常的方法会怎样? 那它必须周期性地调用Thread.interrupted()方法,该方法在接收到中断请求后返回true。例如:
- for (int i = 0; i < inputs.length; i++) {
- heavyCrunch(inputs[i]);
- if (Thread.interrupted()) {
- // We've been interrupted: no more crunching.
- return;
- }
- }
Join
Join()方法可以让一个线程等待另一个线程执行完成。
将会使当前线程暂停执行并等待t执行完成。重载的join()方法可以让开发者自定义等待周期。然而,和sleep()方法一样join()方法依赖于操作系统的时间处理机制,你不能假定join()方法将会精确的等待你所定义的时长。
如同sleep()方法,join()方法响应中断并在中断时抛出InterruptedException。
一个简单的线程例子
下面这个简单的例子将会把这一节的一些概念放到一起演示。SimpleThreads程序有两个线程组成,第一个是主线程,它从创建了一个线程并等待它执行完成。如果MessageLoop线程执行了太长时间,主线程将会将其中断。
MessageLoop现场将会打印一系列的信息。如果中断在它打印完所有信息前发生,它将会打印一个特定的消息并退出。
- public class SimpleThreads {
- // Display a message, preceded by
- // the name of the current thread
- static void threadMessage(String message) {
- String threadName =
- Thread.currentThread().getName();
- System.out.format("%s: %s%n",
- threadName,
- message);
- }
- private static class MessageLoop
- implements Runnable {
- public void run() {
- String importantInfo[] = {
- "Mares eat oats",
- "Does eat oats",
- "Little lambs eat ivy",
- "A kid will eat ivy too"
- };
- try {
- for (int i = 0;
- i < importantInfo.length;
- i++) {
- // Pause for 4 seconds
- Thread.sleep(4000);
- // Print a message
- threadMessage(importantInfo[i]);
- }
- } catch (InterruptedException e) {
- threadMessage("I wasn't done!");
- }
- }
- }
- public static void main(String args[])
- throws InterruptedException {
- // Delay, in milliseconds before
- // we interrupt MessageLoop
- // thread (default one hour).
- long patience = 1000 * 60 * 60;
- // If command line argument
- // present, gives patience
- // in seconds.
- if (args.length > 0) {
- try {
- patience = Long.parseLong(args[0]) * 1000;
- } catch (NumberFormatException e) {
- System.err.println("Argument must be an integer.");
- System.exit(1);
- }
- }
- threadMessage("Starting MessageLoop thread");
- long startTime = System.currentTimeMillis();
- Thread t = new Thread(new MessageLoop());
- t.start();
- threadMessage("Waiting for MessageLoop thread to finish");
- // loop until MessageLoop
- // thread exits
- while (t.isAlive()) {
- threadMessage("Still waiting...");
- // Wait maximum of 1 second
- // for MessageLoop thread
- // to finish.
- t.join(1000);
- if (((System.currentTimeMillis() - startTime) > patience)
- && t.isAlive()) {
- threadMessage("Tired of waiting!");
- t.interrupt();
- // Shouldn't be long now
- // -- wait indefinitely
- t.join();
- }
- }
- threadMessage("Finally!");
- }
- }
相关推荐
每个程序都至少拥有一个线程-即作为Java虚拟机(JVM)启动参数运行在主类main方法的线程。在Java虚拟机初始化过程中也可能启动其他的后台线程。这种线程的数目和种类因JVM的实现而异。然而所有用户级线程都是显式被...
《java并发编程实战》是java并发的圣经。亲自整理目录结构,层级分明(福昕阅读器整理)。高清。
Java并发编程面试题整理150问 Java并发编程面试题整理150问 Java并发编程面试题整理150问 Java并发编程面试题整理150问 Java并发编程面试题整理150问
蚂蚁金服技术专家整理,Java并发体系-高清版思维导图! 包含日常开发以及集群应用并发技术思维导图~
多线程从1.2到1.7各种接口使用及场景介绍。
JAVA并发[整理].pdf
不管你是新程序员还是...注:本文档根据http://www.importnew.com/12773.html 和http://ifeve.com/java-multi-threading-concurrency-interview-questions-with-answers/ 这两个网站的并发编程试题集整理得到的文档,
Java并发面试题整理(答案)
Java并发面试题整理(答案)
java并发编程-超级大全整理
JAVA并发编程 核心方法与框架 ,高洪岩著;Java并发编程:设计原则与模式(第二版);Java并发编程实战(中文版);Java多线程编程核心技术_完整版;Java多线程编程实战指南 设计模式篇
java并发编程实战源码 concurrent-programming 《Java 并发编程实战》源码整理
Java整个知识体系,大概介绍了java进阶需要学习的相关知识
Java并发编程最全面试题 123道.pdf Java并发编程面试题 75题.pdf JAVA核心面试知识点整理.pdf Java垃圾收集必备手册.pdf Java虚拟机(JVM)面试题 51道.pdf SpringBoot面试题 30道.pdf Spring面试题(含答案).pdf ...
《实战java高并发程序设计》源码整理
囊括了Android面试中的java多线程知识,包括线程的基础、threadLoca|、并发编程中的锁 JMM synchronized关键字 以及部分垃圾回收机制
讲java并发编程做了一个整理,可以帮助理清一些概念,帮助理解
java面试过程中遇到的问题及回答整理,包括Java基础,算法与数据结构,jvm,集合源码,JavaEE,海量数据处理,并发与多线程。希望可以帮助到你
本资源包含两个 pdf 文档,一本根据 Jakob Jenkov 最新博客 (http://tutorials.jenkov.com/java-util-concurrent/index.html) 整理的 java_util_concurrent_user_guide_en.pdf,一个中文翻译的 java_util_concurrent...
包含锁、多线程、队列、AQS