Java多线程要点分析总结 (五)

2014-11-24 11:10:36 · 作者: · 浏览: 8
.getFlag()) { // 如果为假
try {
per.wait(); // 等待线程
} catch (Exception e) {
}
} else {
System.out.println("\t" + Thread.currentThread().getName() + "号线程开始消费:" + per.getName() + " - " + per.getSex());
per.setFlag(false);
per.notify();
}
}
}
}
}

/**
* 生产者与消费者 线程通信问题 应用等待唤醒机制
*/
public class ThreadCommunication {
public static void main(String[] args) {
Person per = new Person();
Producer prod = new Producer(per);
Consumer cons = new Consumer(per);
new Thread(prod).start(); // 启动线程开始生产
new Thread(cons).start(); // 启动线程开始消费
}
}

class Person {
private String name;
private char sex;
private boolean flag;

public void setName(String name) {
this.name = name;
}
public String getName() {
return this.name;
}
public void setSex(char sex) {
this.sex = sex;
}
public char getSex() {
return this.sex;
}
public void setFlag(boolean flag) {
this.flag = flag;
}
public boolean getFlag() {
return this.flag;
}
}

/* 生产者 */
class Producer implements Runnable {
private Person per;

public Producer(Person per) {
this.per = per;
}

public void run() { // 生产者不断生产内容
int i = 0;
while(true) {
synchronized(per) {
if(per.getFlag()) { // 如果为真就等待
try {
per.wait(); // 等待线程
} catch (Exception e) {
}
} else {
if(i == 0) {
per.setName("西门庆");
per.setSex('男');
} else {
per.setName("潘金莲");
per.setSex('女');
}
System.out.println(Thread.currentThread().getName() + "号线程开始生产:" + per.getName() + " - " + per.getSex());
i = (i+1)%2;
per.setFlag(true);
per.notify(); // 唤醒等待线程
}
}
}
}
}

/* 消费者 */
class Consumer implements Runnable {
private Person per;

public Consumer(Person per) {
this.per = per;
}

public void run() { // 消费者不断取走内容
while(true) {
synchronized(per) {
if(!per.getFlag()) { // 如果为假
try {
per.wait(); // 等待线程
} catch (Exception e) {
}
} else {
System.out.println("\t" + Thread.currentThread().getName() + "号线程开始消费:" + per.getName() + " - " + per.getSex());
per.setFlag(false);
per.notify();
}
}
}
}
}

/**
* 生产者与消费者 线程通信问题 应用等待唤醒机制
*/
public class ThreadCommunication {
public static void main(String[] args) {
Person per = new Person();
Producer prod = new Producer(per);
Consumer cons = new Consumer(per);
new Thread(prod).start(); // 启动线程开始生产
new Thread(cons).start(); // 启动线程开始消费
}
}

5:模拟银行存取案例
业务分析:
模拟银行中多个线程同时对一个储蓄账户进行存款,取款操作。
Account:个人账户
Bank:取款,存款,查询余额
[java]
class Account {
private String name;
private double amount;

public Account(String name, double amount) {
this.name = name;
this.amount = amount;
}
public void setName(String name) {
this.name = name;
}
public String getName() {
return this.name;
}
public void setAmount(double amount) {
this.amount = amount;
}
public double getAmount() {
return this.amount;
}
}
class Bank {
private Account account;

public Bank(Account account) {
this.account = account;
}
// 存钱
public synchronized void deposit(double amount) {
double tmp = account.getAmount