1

与问题相关: Java Threading with MYSQL 不解

计数器 int 是同步的,对 executeQuery 的函数调用是不同步的。我得到的结果

计数器:1

来自 MYSQL 的行:1

计数器:2

来自 MYSQL 的行:1

计数器:3

来自 MYSQL 的行:1

MYSQL 的预期输出-> 行:应该与计数器相同

所有线程同时运行第一个查询。因此他们得到相同的结果ID。但是,它们为计数器迭代同步。对我来说这是荒谬的。这种行为是否记录在案?我怎样才能绕过它?验证器.java

public void run() {

int id = 0;
    String query = "SELECT ID_num FROM Searches WHERE checked='0'";
    ResultSet results;
    synchronized (this.database) {
        results = this.database.executeQuery(query);
        if (results.next()) {
            id = results.getInt(1);
            query = "UPDATE Searches  SET checked='1' WHERE ID_num='"
                    + id + "'";
            this.database.counter++;
            System.out.println(this.database.counter);
            System.out.println(id);

        }
    }
}

核心.java

for (int i = 0; i < verifier.length; i++) {
            MySQL database=new MySQL();
           verifier[i]=new Thread(new Verifier(database,i+1));  
            verifier[i].start(); 
    }

MySQL.java

public class MySQL{
    int counter=0;
....

}
4

1 回答 1

1

编辑:我看到了问题,您更新查询没有提交结果。您在更新后 shld 提交,您会看到表数也会发生变化。

EDIT2:OP 说

MYSQL 的预期输出-> 行:应该与计数器相同

但是使用当前代码无法实现。以下是程序的逻辑:

  1. 使用 获取所有行checked='0'
  2. 线程将更新所有获取的行checked='1'
  3. 第二个线程来了,如果第一个线程提交行,它会尝试查找checked='0'始终为 0 的行。

为了实现这种行为,您不应该checked='0'在查询中硬编码,而是应该从线程计数派生 [i传递给验证程序的值]

EDIT3:这里有一个更正,线程不会按顺序执行,因为database为每个线程创建了新线程。以上几点仍然适用,但这将使实现预期结果更加困难。

于 2013-11-15T04:47:15.763 回答