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){
相关文档:
好几天没写博客,这几天都忙着写代码,中期检查刚过,后面剩下的时间实际很少了,要抓紧时间了,马上就得毕业走人了。言归正传,在编码过程中遇到的问题,我都记录在博客中,方便以后查阅写论文。这次是计算网络地址,给出一个ip和它的子网掩码,通过运算得到网络地址(或者说是网络号)
public static ......
volatile关键字有什么用?
恐怕比较一下volatile和synchronized的不同是最容易解释清楚的。volatile是变量修饰符,而synchronized则作用于一段代码或方法;看如下三句get代码:
int i1; ......
public class OperatExcel
{
private File file = new File(ParamenterInit.SRCEXCELPATH);
private File outfile = new File(ParamenterInit.DESTEXCELPATH);
private static String sheetName = ParamenterInit.SHEETNAME;
  ......
Java下的一个简单易用的反编译工具jad
,
可以很方便的将.class反编译为.Java.
一、基本用法
Usage:jad
[option(s)]
直接输入类文件名,且支持通配符,如下所示。
c:\Java\>jad
example1.class
c:\Java\>jad
*.class
结果是将example1.class反编译为example1.jad
。将
example1.jad
改为exampl ......