62,612
社区成员
发帖
与我相关
我的任务
分享
public class Translate extends Thread{
private Person p1;
private Person p2;
private int money;
public Translate(Person p1, Person p2, int money) {
this.p1 = p1;
this.p2 = p2;
this.money = money;
}
@Override
public void run() {
try {
p1.del(money);
p2.add(money);
}
catch (InterruptedException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
Person pA = new Person("A", 200);
Person pB = new Person("B", 200);
Person pC = new Person("C", 200);
Person pD = new Person("D", 200);
Translate t1 = new Translate(pA, pB, 20);
Translate t2 = new Translate(pC, pB, 20);
Translate t3 = new Translate(pC, pD, 20);
t1.start();
t2.start();
t3.start();
}
}
class Person {
private double account;
private String name;
public Person(String name, double account) {
this.account = account;
this.name = name;
}
public synchronized void add(double money) throws InterruptedException {
account += money;
printMenoy("add");
Thread.sleep(2000); // 处理时间,通过这来看出其他线程的阻塞
}
public synchronized void del(double money) throws InterruptedException {
account -= money;
printMenoy("delete");
}
public void printMenoy(String deal) {
System.out.println("Deal with: " + deal + " -- " + name + "'s money :" + account);
}
}
public interface Transfer {
void action(Transfer transfer);
}
public class TransferImp implements Transfer {
public synchronized action(Transfer transfer) {
synchronized (transfer) {
...
}
}
}
public class TransferThread implements Runnable {
private Transfer from;
private Transfer to;
public TransferThread(Transfer from, Transfer to) {
this.from = from;
this.to = to;
}
public void run() {
from.action(to);
}
}
public class Test {
public void static main(String[] args) {
// 如果是Web环境下你只要将地下申明的a,b,c,e,f对象放入全局就行(如static,application,session等),根据你实际情况
Transfer a = new TransferImp();
Transfer b = new TransferImp();
Transfer c = new TransferImp();
Transfer e = new TransferImp();
Transfer f = new TransferImp();
Thread t1 = new Thread(new TransferThread(a,b));
Thread t2 = new Thread(new TransferThread(c,b));
Thread t3 = new Thread(new TransferThread(e,f));
t1.start();
t2.start();
t3.start();
}
}