package work_;
//import thread.T1;
/**
* @author Akita Hooyu
* @version 1.0
*/
//Java编程思想更多的是面向对象,所有优先实现
public class Work02 {
public static void main(String[] args) {
//正确写法
T t = new T();
Thread thread1 = new Thread(t);
thread1.setName("t1");
Thread thread2 = new Thread(t);
thread2.setName("t2");
thread1.start();
thread2.start();
}
//方法一,但无法共用一个账户
// T[] t = new T[2]; // 创建两个线程
// for (int i = 0; i < 2; i++) {
// t[i] = new T(String.valueOf(i)); // 将每个线程new个Bank对象
// // String.valueOf()方法可将整型数据转化成字符串类型
// t[i].start();
// }
}
//方法二,依然同方法一
// T t1 = new T();
// t1.setName("t1");
// t1.start();
// T t2 = new T();
// t2.setName("t2");
// t2.start();
class T implements Runnable {
private int money = 10000;
@Override
public void run() {
while (true) {
//解读
//1. 这里使用 synchronized 实现了线程同步
//2. 当多个线程执行到这里时,就会去争夺 this对象锁
//3. 哪个线程争夺到(获取)this对象锁,就执行 synchronized 代码块, 执行完后,会释放this对象锁
//4. 争夺不到this对象锁,就blocked ,准备继续争夺
//5. this对象锁是非公平锁.
synchronized (this) {//
//判断余额是否够
if (money < 1000) {
System.out.println("余额不足");
break;
}
money -= 1000;
System.out.println(Thread.currentThread().getName() + " 取出了1000 当前余额=" + money);
}
//休眠1s
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
//下面也是错误的,可能是锁的错误
//class T extends Thread {
// private double allNum = 10000;
// private double money = 1000;
//
public T(String name) {
super(name);
}
//
//
// @Override
// public synchronized void run() {
// while (true) {
// System.out.println("取1000元");
// if (allNum - money < 0) {
// System.out.println("你的余额不足");
// break;
// }
// allNum -= money;
// System.out.println(Thread.currentThread().getName() + " 取出1000后当前余额=" + allNum);
// }
// try {
// Thread.sleep(1000);
// } catch (InterruptedException e) {
// e.printStackTrace();
// }
// /* 不可以用throws进行抛出
// run()方法是当调用start()方法后,JVM再去调用run()方法,
// throws抛出异常是往上一级的调用者JVM,抛给JVM在java中是不允许的,
// */
//
// }
//
//
//}