//以下为副线程
public class Account extends Thread{
//属性
private double balance;
private double money;
//getter&&setter
public double getMoney() {
return money;
}
public void setMoney(double money) {
this.money = money;
}
public double getBalance() {
return balance;
}
public void setBalance(double balance) {
this.balance = balance;
}
//构造器
public Account(){
}
public Account(double balance){
this.balance=balance;
}
//方法
//重写run方法
@Override
public void run() {
boolean isflag=true;
int i;
while(isflag) {
for(i=1;i<4;i++){
add(1000);
}
isflag=false;
//withdraw(money);
}
}
//取方法
//锁为this
public synchronized void withdraw(double money){
if(money<0||balance<money){
System.out.println("余额不足,取钱失败");
}
else{
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
balance=balance-money;
System.out.println(Thread.currentThread().getName()+"取钱");
System.out.println("取钱成功,余额为"+balance);
}
}
//存钱
public void add(double money){
if(balance<0){
System.out.println("输入错误");
}
else{
balance=balance+money;
System.out.println("存钱成功,余额为"+balance);
}
}
//
}
以下为主函数
public class AccountTest {
//使用Runnable接口,默认锁为this
public static void main(String[] args){
Account acc=new Account(3000);
System.out.println("13" );
//创建两个线程
Thread t1=new Thread (acc);
Thread t2=new Thread (acc);
t1.setName("取钱人1");
t2.setName("取钱人2");
//两个线程同时进行工作
t1.start();
t2.start();
}
}
//包含的错误有:
1.线程安全问题没解决
2.extends Thread 和 implements Runnable 接口已经搞混
//需要重新修改,并且复习这部分知识
//20220802修改
package a;
import java.util.concurrent.locks.ReentrantLock;
/**
* @author
* @create 2022-08-0120:07
*/
//用lock锁进行修改,解决线程安全问题,并且清晰了Runnable和Thread的new用法
//以下为主要类
public class Account implements Runnable{
//属性
private double balance;
private double money;
//getter&&setter
public double getMoney() {
return money;
}
public void setMoney(double money) {
this.money = money;
}
public double getBalance() {
return balance;
}
public void setBalance(double balance) {
this.balance = balance;
}
//构造器
public Account(){
}
public Account(double balance){
this.balance=balance;
}
//方法
//重写run方法
@Override
public void run() {
boolean isflag=true;
int i;
while(isflag) {
for(i=1;i<4;i++){
add(1000);
}
isflag=false;
//withdraw(money);
}
}
//取方法
//锁为this
//采用lock锁
private ReentrantLock lock =new ReentrantLock(true);
public void withdraw(double money){
if(money<0||balance<money){
System.out.println("余额不足,取钱失败");
}
else{
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
lock.lock();
balance=balance-money;
System.out.println(Thread.currentThread().getName()+"取钱");
System.out.println("取钱成功,余额为"+balance);
}
lock.unlock();
}
//存钱
public void add(double money){
if(balance<0){
System.out.println("输入错误");
}
else{
balance=balance+money;
System.out.println("存钱成功,余额为"+balance);
}
}
//
}
//以下为测试类
package a;
/**
* @author
* @create 2022-08-0120:39
*/
public class AccountTest {
//使用继承Thread
public static void main(String[] args){
Account acc=new Account(3000);
System.out.println("13" );
//创建两个线程
Thread t1=new Thread (acc);
Thread t2=new Thread (acc);
t1.setName("取钱人1");
t2.setName("取钱人2");
//两个线程同时进行工作
t1.start();
t2.start();
}
}