Java 小例子:线程同步例子:三个学生取水
三个学生到一个水龙头下排队取水,三人都取完水后一起离开。
这里涉及到如何判断三个人都取完水。如果用普通的静态成员,势必会要用无限循环来等待。更好的办法是用 wait-notify 机制。前两个学生取完水后都 wait,最后一个学生取完水后 notify,这样就能一起离开了。下面是代码示例:
/**
* 三个学生排队取水,取完后一起离开
*
* @author yiding.he
*/
public class SyncDemo_FetchingWater {
private static final ValueLock water = new ValueLock();
public static void main(String[] args) {
String[] student_names = {"甲", "乙", "丙"};
for (String student_name : student_names) {
new Student(student_name).start();
}
}
// 学生
private static class Student extends Thread {
private String name;
private Student(String name) {
this.name = name;
}
@Override
public void run() {
try {
synchronized (water) {
Thread.sleep(1000);
System.out.println("学生" + name + "取完了水。");
water.value++;
if (water.value == 3) {
System.out.println("三个人都取完了水。");
water.notifyAll(); // 只要执行了这个,学生们都会离开。
} else {
water.wait(); // 同时释放了锁,下一个线程进入
}
}
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("学生" + name + "离开了。");
}
}
// 带值的锁
private static class ValueLock {
public int value;
}
}
感谢 bendanlzh 的指点!
相关文档:
一、JAVA。要想成为JAVA(高级)工程师肯定要学习JAVA。一般的程序员或许只需知道一些JAVA的语法结构就可以应付了。但要成为JAVA(高级)工程师,您要对JAVA做比较深入的研究。您应该多研究一下JDBC、IO包、Util包、Text包、JMS、EJB、RMI、线程。如果可能,希望您对JAVA的所有包都浏览一下,知道大概的API,这样您就发现其 ......
一、Array , Arrays
Java所有“存储及随机访问一连串对象”的做法,array是最有效率的一种。
1、
效率高,但容量固定且无法动态改变。
array还有一个缺点是,无法判断其中实际存有多少元素,length只是告诉我们array的容量。
2、Java中有一个Arrays类,专门用来操作array。
a ......
目标:实现一个汉字字符串按汉语拼音字典顺序排序。
原理:在windows环境的gbk字符集里,汉字是按汉语拼音字典顺序编码的,如“础”是B4A1,“储”是B4A2。这里有个问题就像上面的储和础这样的同音字只能遵照编码的顺序了,另外多音字也得遵照编码顺序。设计思路是先拆分汉字字符串为字符数组,获得每 ......
dnd是drag and drop的缩写.
java中的dnd主要涉及到3个类:TransferHandler(用来处理数据的拖放过程),Transferable(用来包装拖放的数据),和DataFlavor(用来表示拖放的数据的类型).下面来介绍这3个类的方法
1.javax.swing.TransferHandler
它有两个构造函数:
TransferHandler() 子类的便捷构造方法。
TransferHandler(St ......