java - 如何使用同步线程将数据插入到我的数据库表中

标签 java multithreading thread-synchronization

我对使用同步线程从mysql表中获取数据有疑问,我尝试使用join(方法),但我想使用synchronized关键字并且需要得到相同的结果。请通过修改我的代码向我提供正确的代码。我是异步执行的。

import java.sql.*;
import java.util.ArrayList;
import java.util.List;

public class SyncThread extends Thread{
    String a1="", b1="";
    public SyncThread(String a,String b)
    {
    a1=a;
    b1=b;
    }
    public void run(){
    try{
    Class.forName("com.mysql.jdbc.Driver");
    Connection con=DriverManager.getConnection("jdbc:mysql://localhost:3306/EmployeeDetails","root","root");
    PreparedStatement stmt=con.prepareStatement("insert into EmployeeDetail values(?,?,?)");
            stmt.setString(1,a1);
            stmt.setString(2,b1);
            stmt.setString(3,Thread.currentThread().getName());
            stmt.execute();
            con.close();

    }
    catch(Exception e){ System.out.println(e);}
    }
public static void main(String args[]){
    List<String> fname=new ArrayList<String>();
        fname.add("Vinoth");
        fname.add("Sesha");
        fname.add("Sachin");
        fname.add("Dinesh");
        fname.add("Karan");
    List<String> lname=new ArrayList<String>();
        lname.add("Kumar");
        lname.add("Janarthan");
        lname.add("Sabarish");
        lname.add("Kumar");
        lname.add("Kumar");
        SyncThread obj;
        for(int i=0;i<5;i++)
        {
                obj=new SyncThread(fname.get(i),lname.get(i));
                obj.start();
//                try{
//                    obj.join();
//                    }catch(Exception e){System.out.println(e);}
        }   
}
}

我期望的输出 fname lname 线程 0 fname lname 线程 1 fname lname 线程 2 fname lname 线程 3 fname lname Thread-4

最佳答案

您可以在想要互斥的 block 上使用同步。同步确保只有一个线程会进入该 block 。它不能保证订单。 要保持顺序,可以使用 join() 方法。 这是您修改后的代码,我只是打印值而不是插入数据库

package helper;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.util.ArrayList;
import java.util.List;

public class Test extends Thread {
  String a1 = "", b1 = "";

  public Test(String a, String b) {
    a1 = a;
    b1 = b;
  }

  Integer resource = new Integer(1);
  public void run() {
    try {
      /*
       * Class.forName("com.mysql.jdbc.Driver"); 
       * Connection con = DriverManager.getConnection(
       * "jdbc:mysql://localhost:3306/EmployeeDetails", "root", "root");
       * PreparedStatement stmt = con.prepareStatement("insert into EmployeeDetail values(?,?,?)");
       * stmt.setString(1, a1); 
       * stmt.setString(2, b1); 
       * stmt.setString(3,Thread.currentThread().getName()); stmt.execute(); con.close();
       */
      synchronized (resource) {
        System.out.println(a1+" # "+b1 +" # "+Thread.currentThread().getName());
      }


    } catch (Exception e) {
      System.out.println(e);
    }
  }

  public static void main(String args[]) throws InterruptedException {
    List<String> fname = new ArrayList<String>();
    fname.add("Vinoth");
    fname.add("Sesha");
    fname.add("Sachin");
    fname.add("Dinesh");
    fname.add("Karan");
    List<String> lname = new ArrayList<String>();
    lname.add("Kumar");
    lname.add("Janarthan");
    lname.add("Sabarish");
    lname.add("Kumar");
    lname.add("Kumar");
    Test obj;
    for (int i = 0; i < 5; i++) {
      obj = new Test(fname.get(i), lname.get(i));
      obj.start();
      obj.join();
      // try{
      // obj.join();
      // }catch(Exception e){System.out.println(e);}
    }
  }
}

输出:

Vinoth # Kumar # Thread-0
Sesha # Janarthan # Thread-1
Sachin # Sabarish # Thread-2
Dinesh # Kumar # Thread-3
Karan # Kumar # Thread-4

关于java - 如何使用同步线程将数据插入到我的数据库表中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56422668/

相关文章:

java - 在 Spring 中注入(inject) Value 始终为 null

java - objectInputStream.readObject() 抛出异常 java.io.OptionalDataException

c++原子读/写误区

java - 为什么在初始化 Timer 实例时会收到 java.security.AccessControlException?

multithreading - Kotlin `?.let` 线程安全吗?

c - 使用互斥量的 pthread 同步

java - 线程 wait() 影响主线程?

java - 通过邮件发送非英文文本的问题

java - 理解这个 Java 程序的执行流程

Python 线程 self._stop() 'Event' 对象不可调用