JAVA线程之六:线程的通信
虽然经常创建多个不相同的线程来完成不相关的任务,然而有时执行的任务可能有一定联系,这样就需要使这些线程进行交互。比如有一个水塘,其中对水塘操作无非包括“进水”和“排水”,这两个行为各自代表一个线程,当水塘中没有水时,“排水”行为不能再进行;当水塘水满时,“进水”行为不能再进行。
在Java中用于线程间通信的方法是在前文中提到过的wait()与notify()方法,拿水塘的例子来说明,线程A代表“进水”,线程B代表“排水”,这两个线程对水塘都具有访问权限。假设线程B试图做“排水”行为,然而水塘中却没有水。这时候线程B只好等待一会。可以使用如下控制:
if(water.isEmpty)
{
water.wait();
}
在由线程A将水塘注水之前,线程B不能从这个队列中释放,它不能再次运行。当线程A将水注入水塘中后,应该由线程A来通知线程序B水塘中已经被注入水了,线程B才可以运行。此时,水塘中等待队列中的第一个被阻塞的线程在队列中被释放出来,并且可以重新加入竞争。可以使用如下控制:
water.setValue(String water)
water.notify();
在此将“进水”与“排水”抽象为线程A,线程B。“水塘”抽象为线程A与线程B的共享对象water,上述情况即可看作线程通信。
线程通信可以使用wait()与notify()方法。notify()方法最多只能释放等待队列中的第一个线程,如果有多个线程在等待,可以使用notifyAll()方法,释放所有线程。另外,wait()方法除了可以被notify()方法调用终止以外,还可以通过调用线程的interrupt()方法来中断,前文中已经提到过,通过调用线程的interrupt()方法来终止,wait()方法会抛出一个异常。因此,如同sleep()方法,也需要将wait()方法放在try/catch语句块中。
在实际应用中,wait()与notify()方法必须在同步方法或同步块中调用,因为只有获得这个共享对象,才可能释放它。为了使线程对一个对象调用wait()或notiry()方法,线程必须锁定那个特定的对象,这个时候就需要同步机制进行保护。举例如下:
(1)以水塘为例,下面是在同步机制保护下调用wait()方法的代码片段。
synchronized(water){
相关文档:
用三种方法来实现字符串的反转
/**
* @(#)ReverseString.java
*
* ReverseString application
*
* @author
* @version 1.00 2010/4/20
*/
import java.util.*;
import java.io.*;
public class ReverseString {
public static void main(String[] args) throws IOException{
......
本文出自 “唐大老师” 博客,请务必保留此出处http://tscjsj.blog.51cto.com/412451/84561
public class Bubble {
// 冒泡排序函数1
public static void bubbleSort1(Comparable []data){
int position,scan;
Comparable temp;
for(position = data.length-1;position>=0;position--){
......
在java中,使用double进行运算,有时会出现精度丢失的问题,值会有那么0.00000***1偏差的偏差,导致匹配校验常常出现问题
解决方案如下:
/**
* 对double数据进行取精度.
* @param value double数据.
* ......
JAVA中转义字符:
1.八进制转义序列:\ + 1到3位5数字;范围'\000'~'\377'
\0:空字符
2.Unicode转义字符:\u + 四个十六进制数字;0~65535
\u0000:空字符
3.特殊字符:就3个
\":双引号
&nbs ......