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 的指点!
相关文档:
最简单的服务器接受单用户请求的socket编程模型,代码写得不好,只是用来阐明意思
client side
import java.net.*;
import java.util.*;
import java.io.*;
public class Client {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
tr ......
最近找工作做笔试题发现很重要,就自己写了一点,和大家分享
import java.util.Stack;
import java.util.HashMap;
public class BinTree {
private char date;
private BinTree lchild;
private BinTree rchild;
public BinTree(char c) {
date = c;
}
// 先序遍历递归
public static void preOrder(Bi ......
定义在一个类内部的类叫内部类,包含内部类的类称为外部类。
内部类可以声明public、protected、private等访问限制,
可以声明为abstract的供其他内部类或外部类继承与扩展,
或者声明为static、final的,也可以实现特定的接口。
static的内部类行为上象一个独立的类,
非static在行为上类似类的属性或方法且禁止声明s ......
在编程的时候,经常遇到要判断一个字符串中的字符是否是数字(0-9)
下面我给大家介绍几种实现方法
1.使用Character.isDigit(char)判断
String str = "123abc";
if (!"".equals(str)) {
char num[] = str.toCharArray();//把字符串转换为字符数组
StringBuffer title = new StringBuffer();//使用S ......
正则表达式是字符串处理的终极武器,本文以一个具体题目简介java对正则表达式的支持。
题目:将一个字符串中的形如href=“XXXX”和src=“XXXX”的部分取出,打印。
处理正则表达式主要用到java.util.regex.Matcher和java.util.regex.Pattern两个类。
\\测试用的字符串
String source= "...href=\" ......