练习1:三个售票窗口同时出售20张票
public class Sale extends Thread {
private String name;
private static int num = 20;
private static Object lock = new Object();
public Sale(String name) {
this.name = name;
}
@Override
public void run() {
while (num > 0) {
try {
sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (lock) {
if (num > 0) {
System.out.println(name + "售出第" + num + "张票...");
num--;
} else
System.out.println("票已经售尽...");
}
}
}
public static void main(String[] args) {
for (int i = 0; i < 3; i++) {
new Sale("第" + (i + 1) + "个窗口").start();
}
}
}
练习2:两个人AB通过一个账户A在柜台取钱和B在ATM机取钱
分析:两个人AB实际上就是两个线程,操作同一个账号实际上为了避免出现问题则必须使用锁
public class Account {
private double balance=10000;
public synchronized void sub(double amount) {
if (balance > amount) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
balance = balance - amount;
}
}
}
public class Sub extends Thread {
private Account account;
private double amount;
public Sub(Account a, double am) {
this.account = a;
this.amount = am;
}
@Override
public void run() {
account.sub(amount);
}
}
练习3:过山洞问题:请按要求编写多线程应用程序,模拟多个人通过一个山洞:
1、这个山洞每次只能通过一个人,每个人通过山洞的时间为2秒;
2、随机生成10个人,同时准备过此山洞,并且定义一个变量用于记录通过人的信息
public class 山洞 {
private StringBuffer logs = new StringBuffer();
private int num=0;
private int counter =0;
private static final Object lock=new Object();
public void 过山洞(){