java 线程池实现多线程 PostgreSQL数据库录入

it2022-05-05  77

转载自https://blog.csdn.net/u010682330/article/details/81110494

import java.util.ArrayList; import java.util.List; import java.util.concurrent.CountDownLatch; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class test { public static void exec(List<String> list) throws InterruptedException { int count = 105; int listSize = list.size(); int runSize = (listSize / count) + 1; List<String> newlist = null; ExecutorService executor = Executors.newFixedThreadPool(runSize); //创建一个线程池,数量和开启线程的数量一样 //创建两个个计数器 CountDownLatch begin = new CountDownLatch(1); CountDownLatch end = new CountDownLatch(runSize); //循环创建线程 for (int i = 0; i < runSize; i++) { //计算每个线程执行的数据 if ((i + 1) == runSize) { int startIndex = (i * count); int endIndex = list.size(); newlist = list.subList(startIndex, endIndex); } else { int startIndex = (i * count); int endIndex = (i + 1) * count; newlist = list.subList(startIndex, endIndex); } //线程类 MyThread mythead = new MyThread(newlist, begin, end); //这里执行线程的方式是调用线程池里的executor.execute(mythead)方法。 executor.execute(mythead); } begin.countDown(); end.await(); //执行完关闭线程池 executor.shutdown(); } public static void main(String[] args) { List<String> list = new ArrayList<String>(); long pre=0; long post=0; //数据越大线程越多 for (int i = 0; i < 10000; i++) { list.add("hello" + i); } try { pre=System.currentTimeMillis(); exec(list); post=System.currentTimeMillis(); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println((post-pre)); } } import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.util.List; import java.util.concurrent.CountDownLatch; public class MyThread implements Runnable { private List<String> list; private CountDownLatch begin; private CountDownLatch end; //创建个构造函数初始化 list,和其他用到的参数 public MyThread(List<String> list, CountDownLatch begin, CountDownLatch end) { this.list = list; this.begin = begin; this.end = end; } public void run() { try { Connection c = null; PreparedStatement stmt = null; try { Class.forName("org.postgresql.Driver"); c = DriverManager.getConnection("jdbc:postgresql://192.168.5.77:54321/gv_dm_test", "postgres", "postgres"); String sql = "insert into tttt(test) values(?);"; for (int i = 0; i < list.size(); i++) { stmt =(PreparedStatement) c.prepareStatement(sql); stmt.setString(1, list.get(i)); stmt.executeUpdate(); stmt.close(); } c.close(); } catch (Exception e) { System.err.println(e.getClass().getName() + ": " + e.getMessage()); System.exit(0); } //执行完让线程直接进入等待 begin.await(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } finally { //这里要主要了,当一个线程执行完 了计数要减一不然这个线程会被一直挂起,end.countDown(),这个方法就是直接把计数器减一的 end.countDown(); } } }

pom.xml

<dependency> <groupId>org.postgresql</groupId> <artifactId>postgresql</artifactId> <version>9.3-1100-jdbc41</version> </dependency>

最新回复(0)