我的任务是创建一个Java应用程序,它使用2个同步线程来计算每月利息并更新帐户余额

我的任务是创建一个Java应用程序,它使用2个同步线程来计算每月利息并更新帐户余额,java,multithreading,Java,Multithreading,这是供参考的参数代码。 创建AccountSaves类。该类有两个实例变量:一个用于保持年利率的双变量和一个用于保持储蓄余额的双变量。年利率为5.3,储蓄余额为100美元。 •创建计算月利息的方法。 •创建一个运行两个线程的方法。使用匿名类来创建这些线程。第一个线程调用每月利息计算方法12次,然后显示储蓄余额(第12个月的余额)。之后,该线程休眠5秒。第二个线程调用每月利息计算方法12次,然后显示储蓄余额(第12个月的余额)。在主线程结束之前,必须完成这两个线程。 •将主方法添加到同一类中,并测

这是供参考的参数代码。 创建AccountSaves类。该类有两个实例变量:一个用于保持年利率的双变量和一个用于保持储蓄余额的双变量。年利率为5.3,储蓄余额为100美元。
•创建计算月利息的方法。 •创建一个运行两个线程的方法。使用匿名类来创建这些线程。第一个线程调用每月利息计算方法12次,然后显示储蓄余额(第12个月的余额)。之后,该线程休眠5秒。第二个线程调用每月利息计算方法12次,然后显示储蓄余额(第12个月的余额)。在主线程结束之前,必须完成这两个线程。 •将主方法添加到同一类中,并测试线程。执行这两个线程后,储蓄余额必须保持不变

在runThread方法中调用monthlyInterest方法时出错。 无法从静态上下文引用非静态方法monthlyInterest() 我似乎不知道如何解决这个问题

导入静态java.lang.Thread.sleep;
班级帐户储蓄{
双倍年利率=5.3;
双倍储蓄=100.00;
公共无效月利息(){
双月桂酸酯;
月利率=年利率/12;
双平衡=0;
余额+=储蓄*月利率;
}
公共同步静态void runThread(){
螺纹t1;
t1=新线程(){
AccountSavings=新帐户储蓄();
@凌驾
公开募捐{
对于(int i=1;i编辑

从AccountSavings对象调用该方法如何? 账户储蓄。月利息()

类账户储蓄{
私人双年利=5.3;
私人双平衡=0;
公共无效月利息(){
双月利率=年利率/12;
双倍储蓄=100.00;
余额+=储蓄*月利率;
}
公共静态void runThread(){
螺纹t1;
t1=新线程(){
AccountSavings=新帐户储蓄();
@凌驾
公开募捐{
int i=1;
对于(;i<13;i++){
accountSavings.monthlyInterest();
}
System.out.println(“余额线程1在“+(i-1)+”月份之后:“+accountSavings.Balance”);
试一试{
睡眠(5000);
}捕捉(中断异常e){
//睡不着
}
}
};
线程t2=新线程(){
@凌驾
公开募捐{
AccountSavings=新帐户储蓄();
int i=1;
对于(;i<13;i++){
accountSavings.monthlyInterest();
}
System.out.println(“余额线程2在“+(i-1)+”月份之后:“+accountSavings.Balance”);
试一试{
睡眠(5000);
}捕捉(中断异常e){
//睡不着
}
}
};
t1.start();
t2.start();
}
公共静态void main(字符串[]args){
runThread();
}
}
  • 12个月后的余额线程1:530.0000000000001
  • 12个月后的余额线程2:530.0000000000001

  • 首先,关键字
    synchronized
    必须转到将执行关键部分的方法,而不是创建线程的方法。因此,在本例中,它必须转到monthlyInterest。现在,您正在创建两个AccountSavings,它们只被一个线程修改,因此存在无需添加
    synchronized
    关键字,除非您希望通过多个线程对其进行修改。此外,我建议使用Java 8 lambda语法创建线程,这更简单、更易于阅读。最后,您的代码看起来与下面的代码类似

    账户储蓄

    public class AccountSavings {
    
        private double annualInterest;
        private double savings;
        private double balance;
    
        public synchronized double monthlyInterest() {
            double monthlyRate;
            monthlyRate = annualInterest / 12;
            balance += savings * monthlyRate;
            return balance;
        }
    
        AccountSavings(double annualInterest, double savings, double balance) {
            this.annualInterest = annualInterest;
            this.savings = savings;
            this.balance = balance;
        }
    
    }
    
    Main

    public class Main {
    
        public static void main(String args[]) {
    
            Thread t1 = new Thread(() -> {
                AccountSavings accountSavings = new AccountSavings(5.3, 100, 0);
                for (int i = 1; i < 13; i++) {
                    System.out.println("Balance after " + i + "month: " + accountSavings.monthlyInterest() + " | Thread 1");
                }
                try {
                    sleep(5000);
                } catch (Exception e) {
                    System.out.println("Error sleeping");
                }
            });
    
            Thread t2 = new Thread(() -> {
                AccountSavings accountSavings = new AccountSavings(5.3, 100, 0);
                for (int i = 1; i < 13; i++) {
                    System.out.println("Balance after " + i + "month: " + accountSavings.monthlyInterest() + " | Thread 2");
                }
                try {
                    sleep(5000);
                } catch (InterruptedException e) {
                    System.out.println("Error sleeping");
                }
            });
            t1.start();
            t2.start();
    
        }
    
    }
    
    公共类主{
    公共静态void main(字符串参数[]){
    线程t1=新线程(()->{
    账户储蓄=新账户储蓄(5.31000,0);
    对于(int i=1;i<13;i++){
    System.out.println(“在“+i+”月份之后的余额:“+accountSavings.monthlyInterest()+”线程1”);
    }
    试一试{
    睡眠(5000);
    }捕获(例外e){
    System.out.println(“错误休眠”);
    }
    });
    线程t2=新线程(()->{
    账户储蓄=新账户储蓄(5.31000,0);
    对于(int i=1;i<13;i++){
    System.out.println(“在“+i+”月份之后的余额:“+accountSavings.monthlyInterest()+”线程2”);
    }
    试一试{
    睡眠(5000);
    }捕捉(中断异常e){
    System.out.println(“错误休眠”);
    }
    });
    t1.start();
    t2.start();
    }
    }
    
    感谢您提供的信息,在与我的教授交谈后,她特别要求我们创建一个方法来运行线程,然后在主方法中调用该方法。因此,我现在的问题是,我是否保留runThread方法并在main中调用它,或者有没有比我目前所做的更有效的方法?调用<代码>运行线程
    在您的主类中是可以的。实际上没有太多的选择。您可以按照自己的方式执行,即调用静态方法或创建新类。我认为静态方法方法更适合此练习。
    public class AccountSavings {
    
        private double annualInterest;
        private double savings;
        private double balance;
    
        public synchronized double monthlyInterest() {
            double monthlyRate;
            monthlyRate = annualInterest / 12;
            balance += savings * monthlyRate;
            return balance;
        }
    
        AccountSavings(double annualInterest, double savings, double balance) {
            this.annualInterest = annualInterest;
            this.savings = savings;
            this.balance = balance;
        }
    
    }
    
    public class Main {
    
        public static void main(String args[]) {
    
            Thread t1 = new Thread(() -> {
                AccountSavings accountSavings = new AccountSavings(5.3, 100, 0);
                for (int i = 1; i < 13; i++) {
                    System.out.println("Balance after " + i + "month: " + accountSavings.monthlyInterest() + " | Thread 1");
                }
                try {
                    sleep(5000);
                } catch (Exception e) {
                    System.out.println("Error sleeping");
                }
            });
    
            Thread t2 = new Thread(() -> {
                AccountSavings accountSavings = new AccountSavings(5.3, 100, 0);
                for (int i = 1; i < 13; i++) {
                    System.out.println("Balance after " + i + "month: " + accountSavings.monthlyInterest() + " | Thread 2");
                }
                try {
                    sleep(5000);
                } catch (InterruptedException e) {
                    System.out.println("Error sleeping");
                }
            });
            t1.start();
            t2.start();
    
        }
    
    }