首先是思路 因为是模拟实现线程的并发执行 但是当有多个线程的执行涉及同一个资源的使用的时候就需要实现一种互斥
使用一个标志位 当有一个线程正在对资源进行操作的时候 其他的线程只能先等待
利用循环实现 每次循环找到满足条件的线程进行操作
本实例是模拟银行取钱 和存钱的进程 (原理上有点问题 没有完全实现并发执行的效果)
所以贴出代码希望大家可以互相交流指导:
代码如下:
package text1;
public class Bank {
private double money;
private String name;//定义账户名称和金额
private static int flag=0;
public Bank(String s,double m) {//重写方法
name = s;
money = m;
}
class CQ extends Thread{//存钱
private double m;
private Bank b;//定义账户名称和金额
public CQ(Bank ba,double m) {
b=ba;
this.m= m;
}
public void run() {
System.out.print(b.name+"账户余额为:"+money+"元 ");
System.out.print("向"+b.name+"账户存入"+m+"元 ");
money=money+m;
System.out.print(b.name+"账户余额为:"+money+"元\n");
flag=0;
}
}
class QQ extends Thread{//取钱
private double m;
private Bank b;//定义账户名称和金额
public QQ(Bank ba,double m) {
b=ba;
this.m= m;
}
public void run() {
System.out.print(b.name+"账户余额为:"+money+"元 ");
System.out.print("向"+b.name+"账户取出"+m+"元 ");
money=money-m;
System.out.print(b.name+"账户余额为:"+money+"元\n");
flag=0;
}
}
public static void main(String[] args) {
Bank b= new Bank("张三",1000);
Object[] ob=new Object[10];
//QQ[] qq=new QQ[10];
int i=0;//计数在等待的线程
ob[i++]=b.new CQ(b,3000);
ob[i++]=b.new CQ(b,2000);
ob[i++]=b.new CQ(b,5000);
ob[i++]=b.new QQ(b,4000);
ob[i++]=b.new QQ(b,2000);
ob[i++]=b.new QQ(b,3000);
while(true) {
for(int k=0;k<ob.length;k++)
if(ob[k]!=null&&flag==0)
{ flag=1;
((Thread) ob[k]).start();
i--; ob[k]=null;
if(i==0) break;}
if(i==0) break;
}
// while(true) {
// for(int k=0;k<qq.length;k++) if(qq[k]!=null&&flag==0){ flag=1; qq[k].start();j--;qq[k]=null;}
// if(j==0) break;
// }
}
}
运行结果如图:
两次的运行结果不同但是 开始的一个线程是相同的这是我的思路问题