java - 事务系统中未正确显示线程的名称

标签 java multithreading synchronized

我创建了一个事务系统,它似乎可以与同步线程完美配合。 但是,我希望显示进行交易的人的姓名,在以下情况下(EmilyJohn)而不是线程编号。

代码如下:

public class SharedAccountDriver {

  static int balance = 400;

  public static void main(String[] args) {
    SharedAccount sa = new SharedAccount(balance);
    SharedAccountClient c1 = new SharedAccountClient(sa, "JOHN");
    SharedAccountClient c2 = new SharedAccountClient(sa, "EMILY");
    double x1 = 1000.00;
    double x2 = -400;

    c1.setTransaction(x1);
    c2.setTransaction(x2);

    Thread t1 = new Thread(c1);
    Thread t2 = new Thread(c2);
    t1.start();
    t2.start();
  }
}

public class SharedAccountClient implements Runnable {
  double transaction;
  SharedAccount sa;
  static String name;

  public SharedAccountClient(SharedAccount sa, String string) {
    // TODO Auto-generated constructor stub
    this.sa = sa;
    name = string;
  }

  public void setTransaction(double transaction) {
    this.transaction = transaction;
  }

  public void run() {
    sa.completeTransaction(transaction, name);

  }
}

public class SharedAccount {
  private double balance;

  public SharedAccount(double initialAmount) {
    balance = initialAmount;
  }

  public synchronized void completeTransaction(double amount, String name) {
    double temp = this.balance + amount;

    if (amount < 0)
      System.out.println(Thread.currentThread().getName() + "Withdrawing: "
          + Math.abs(amount));
    else
      System.out.println(Thread.currentThread().getName() + "Depositing: "
          + amount);

    try {
      Thread.sleep(1000);
    } catch (InterruptedException e) {
      System.out.println("Transaction interrupted.");
    }

    balance = temp;
    System.out.println("Current Balance: " + balance);
  }
}

输出是:

 Thread-0Depositing: 1000.0
 Current Balance: 1400.0
 Thread-1Withdrawing: 400.0
 Current Balance: 1000.0

我想要的不是 Thread-0Thread-1 的名字,EmilyJohn

最佳答案

为什么要使用 Thread.currentThread().getName()?您还没有更改该值(通过使用 Thread.setName() 或通过使用构造函数 new Thread(runnable, name))。

只需使用您传入的方法参数 name,例如

System.out.println(name + "Withdrawing: " + Math.abs(amount));

顺便说一句,为什么字段 String name 声明为 statically?这意味着它会在您每次调用构造函数时更改,因此两个对象将具有相同的 name

关于java - 事务系统中未正确显示线程的名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29973428/

相关文章:

java - "static class"还是传递引用?

java - 即使在 putty 终端关闭后运行 java 程序

c - pthread 程序中例程的额外执行时间花费了什么?

java - 在 Java 中重写同步方法

java - 我应该同步 notifyObservers 调用吗?

java - 同步集合是否总是需要同步块(synchronized block)?

java - 通过 GenericEntity<List<T>> 在 RESTful Response 对象中使用 Java 泛型模板类型

java - 如何使用 for 循环将字符串 arraylist 转换为 double 进行计算?

java - 引发扫描查询问题

java - 现有 webapp 的 GWT Bootstrap 响应式设计与屏幕