Java 并发核心编程(四)

5、线程

Java中,java.lang.Thread类是用来代表一个应用或者JVM线程。代码是在某个线程类的上下文环境中执行的(使用Thread.currentThread()来获取当前运行的线程)。

5.1、线程通讯

线程之间最简单的通讯方式是一个线程直接调用另一个线程对象的方法。表9中列出的是线程之间可以直接交互的方法。

9:线程协作方法

描述

LinkedList

这个经常被用到的类在JavaSE6中有了新的改进-实现了Deque接口。在LinkedList中,可以使用标准的Deque方法来添加或者删除list两端的元素。LinkedList还可以被当做一个非同步的堆栈,用来替代同步的Stack

ArrayDeque

一个非同步的、支持无限队列长度(根据需要动态扩展队列的长度)的Deque实现类

LinkedBlockingDeque

LinkeBlockingDequeDeque实现中唯一支持并发的、基于链接列表、队列长度可选的类。

线程方法

描述

start

启动一个线程实例,并且执行它的run() 方法。

join

一直阻塞直到其他线程退出

interrupt

中断其他线程。线程如果在一个方法中被阻塞,会对interrupt操作做出回应,并在这个方法执行的线程中抛出InterruptedException异常;否则线程的中断状态被设定。

stop, suspend, resume, destroy

这些方法都被废弃,不应该再使用了。因为线程处理过程中状态问题会导致危险的操作。相反,应该使用interrupt() 或者 volatile标示来告诉一个线程应该做什么。

 

5.2"未捕获异常"处理器

线程能够指定一个UncaughtExceptionHandler来接收任何一个导致线程非正常突然终止的未捕获异常的通知。

 

5.3、死锁

当存在多个线程(最少2个)等待对方占有的资源,就会形成资源循环依赖和线程等待,产生死锁。最常见的导致死锁的资源是对象monitor,同时其他阻塞操作(例如wait/notify)也能导致死锁。

很多新的JVM能够检测Monitor死锁,并且可以将线程 dump中由信号(中断信号)、jstack或者其他线程dump工具生成的死锁原因显示打印出来。

除了死锁,线程之间还会出现饥饿(starvation)和活锁(livelock). Starvation是因为一个线程长时间占有一个锁导致其他的线程一直处于等待状态无法进行下一步操作。Livelock是因为线程发费大量的时间来协调资源的访问或者检测避免死锁导致没有一个线程真正的干活。

 

 

你可能感兴趣的:(java,jvm,thread,编程)