Java 如何使用同步线程将数据插入my db表
我对使用同步线程从mysql表中获取数据表示怀疑,我尝试使用join(方法),但我想使用synchronized关键字并需要得到相同的结果。请通过修改我的代码为我提供正确的代码。我是异步的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
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