Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/359.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用同步线程将数据插入my db表_Java_Multithreading_Thread Synchronization - Fatal编程技术网

Java 如何使用同步线程将数据插入my db表

Java 如何使用同步线程将数据插入my db表,java,multithreading,thread-synchronization,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 SyncThre

我对使用同步线程从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);}
        }   
}
}
import java.sql.*;
导入java.util.ArrayList;
导入java.util.List;
公共类SyncThread扩展线程{
字符串a1=“”,b1=“”;
公共同步线程(字符串a、字符串b)
{
a1=a;
b1=b;
}
公开募捐{
试一试{
Class.forName(“com.mysql.jdbc.Driver”);
Connection con=DriverManager.getConnection(“jdbc:mysql://localhost:3306/EmployeeDetails“,”根“,”根“);
PreparedStatement stmt=con.prepareStatement(“插入员工详细值(?,?)”);
stmt.setString(1,a1);
标准设置管柱(2,b1);
stmt.setString(3,Thread.currentThread().getName());
stmt.execute();
con.close();
}
catch(异常e){System.out.println(e);}
}
公共静态void main(字符串参数[]){
List fname=new ArrayList();
fname.添加(“维诺”);
fname.添加(“Sesha”);
fname.添加(“Sachin”);
fname.添加(“Dinesh”);
fname.添加(“Karan”);
List lname=new ArrayList();
名称加上(“库马尔”);
名称添加(“Janarthan”);
名称添加(“萨巴瑞什”);
名称加上(“库马尔”);
名称加上(“库马尔”);
同步线程obj;

对于(int i=0;i您可以在需要互斥的块上使用synchronized。synchronized确保只有一个线程将进入该块。它不确保顺序。 要维护顺序,可以使用join()方法。 这是修改后的代码,我只是打印值,而不是插入到DB中

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);}
    }
  }
}

synchronized
关键字不能保证线程将按照它们来监视的顺序执行(同步块)。要使用synchronized执行它们-将所需的块提取到一个单独的方法,其中所有线程共享相同的锁-例如,创建一个静态方法,或显式定义
Lock
,并将其用作synchronized块的参数。谢谢,但我得到了输出..但是现在缺少线程-1..这意味着类似于线程-0的op nis thread-2..etcOk,一个系统显示正常,另一个系统显示不正常。没问题。您可以在不使用join()方法的情况下帮助处理相同的输出,但ThreadScheduler不保证线程的执行顺序。您可以在启动线程之前设置线程优先级,如-obj.setPriority(MAX_priority-i);我尝试过执行它…并非所有时间都是同步的
Vinoth # Kumar # Thread-0
Sesha # Janarthan # Thread-1
Sachin # Sabarish # Thread-2
Dinesh # Kumar # Thread-3
Karan # Kumar # Thread-4