所以我一直试图解决这个问题几个小时,我确定它的内容非常简单,或者只是一个我错过的简单错误,但我有一个三级程序,控制,帐户和MyThreads
我试图让多个线程(卡)修改单个帐户,我试图使用一个监视器,因此一次只能有一个线程可以进行更改,这不是我已存档的内容我已经以某种方式允许他们似乎只是消失了,我认为他们只是等待但拒绝醒来......在我崩溃之前有任何帮助吗?
帐户代码:
class account{
private static int value = 0;
private static int cards = 0;
private static int count = 0;
private static int lock = 0;
public void setValue(int temp){
value = temp;
}
public int getValue(){
// while(lock == 1){
// try{
// wait();
// }catch (InterruptedException e){
// }
// }
return value;
}
synchronized public void withdraw(int temp, String tempID){
while(lock == 1){
try{
wait();
}catch (InterruptedException e){}
}
lock=1;
value= value - temp;
count++;
System.out.println(count + "(" + tempID +")"+" "+temp+" - "+value);
lock = 0;
this.notifyAll();
}
synchronized public void deposit(int temp, String tempID){
while(lock == 1){
try{
wait();
}catch (InterruptedException e){}
}
lock=1;
value= value + temp;
count++;
System.out.println(count + "(" + tempID +")"+" - "+temp+" "+value);
lock = 0;
this.notifyAll();
}
public void setCards(int temp){
cards = temp;
}
public int getCards(){
return cards;
}
public int getCount(){
return count;
}
}
控制代码:
class control{
public static void main(String [] args){
account acc = new account();
acc.setValue(1000);
acc.setCards(5);
// if(args.length > 0){
// try{
// int tempCards = Integer.parseInt(args[0]);
//
// }catch (NumberFormatException e) {
// System.err.println("Number of Cards : " + args[0] + " must be an integer.");
// System.exit(1);
// }
// try{
// int tempVal = 0;
// tempVal = Integer.parseInt(args[1]);
// acc.setValue(tempVal);
// }catch (NumberFormatException e) {
// System.err.println("Account Value : " + args[1] + " must be an integer.");
// System.exit(1);
// }
// }else{
// System.err.println("No values found, please start program with the number of Cards and Bank Account Value, both in integer format");
// System.exit(1);
// }
System.out.println("Transaction Withdrawal Deposit Balance");
System.out.println(" " + acc.getValue());
for(int i=0; i<=((acc.getCards())-1); i++){
new MyThreads(Integer.toString(i+1));
}
}
}
MyThreads代码:
class MyThreads implements Runnable{
private String ID;
private Thread t;
account acc = new account();
MyThreads(String tempID){
ID = tempID;
t = new Thread(this, ID);
t.start();
}
public void run(){
try{
for (int i = 0; i < 20; i++){
if(Math.random()>0.5){
int tempW = 0;
tempW = ((int)(Math.random()*100));
acc.withdraw(tempW, this.ID);
//System.out.println(acc.getCount() + "(" + this.ID +")"+" "+tempW+" -"+acc.getValue());
}else{
int tempD = 0;
tempD = ((int)(Math.random()*100));
acc.deposit(tempD, this.ID);
//System.out.println(acc.getCount() + "(" + this.ID +")"+" "+" - "+tempD+" "+acc.getValue());
}
t.sleep(500);
}
} catch (InterruptedException e) {
System.out.println("Thread " + ID + " interrupted.");
}
System.out.println("Thread " + ID + " exiting.");
}
}
我知道它一团糟,原谅我很懒。
答案 0 :(得分:0)
查看Java中Monitor的定义。在您的代码中,您使用关键字synchronized
作为两个方法,它们与:
public void XX(){
lock.lock(); // lock is a private variable
try {
// code here
} finally {
lock.unlock();
}
}
简而言之,它是显式锁定的简写,并且会阻止多个线程同时访问这些方法。
因此,只需删除lock
方法中的while(lock==1)
部分(即synchronized
块)即可。此外,如果在其他代码中您需要实际锁定,请使用Lock
类,而不是整数。
有关更多信息,网上有很多关于多线程的好介绍,例如this one。
答案 1 :(得分:0)
你的问题,也就是答案,是一个很好的混合静态同步和等待通知,被称为。为何使用静电?听起来像一个神奇的词?跳过静态,让生活更轻松。
另请注意,wait-notify与特定对象相关;如果wait-notify与不同的对象相关,则它们不会进行通信。拥有一个可以同步的单个对象。