java - 在mysql中插入记录导致线程数增加

标签 java mysql multithreading java-threads

我创建了两个线程“READ_THREAD”和“WRITE_THREAD”,它们以一定的 sleep 间隔连续运行,如下面的代码所示。当我在没有数据库插入查询和打印线程计数的情况下运行此代码时,它总是给出 3。但是当我在代码中添加插入查询时,线程数增加到 4,并且随着时间的推移......它不断增加。我做错了什么?

public class test {

    public static void main(String[] args) {
        SingcomUC1SerialRunnableThreadClass t1 = new SingcomUC1SerialRunnableThreadClass("READ_THREAD");
        t1.start1();
        SingcomUC1SerialRunnableThreadClass t2 = new SingcomUC1SerialRunnableThreadClass("Write_THREAD");
        t2.start1();
        System.out.println("active thread count=" + Thread.activeCount());
    }
}

public class SingcomUC1SerialRunnableThreadClass implements Runnable {

    Thread t;
    String threadName;
    String singcomUC1Readthread="READ_THREAD";
    String singcomUC1Writethread="Write_THREAD";


    public SingcomUC1SerialRunnableThreadClass(String name) {
        threadName = name;
    }

    public void start1() {
        if (t == null) {
            t = new Thread(this, threadName);
            t.start();
        }
    }

    @Override
    public void run() {
        System.out.println("run() invokations");
        while (true) {
            if (threadName.equalsIgnoreCase(singcomUC1Readthread)) {
                System.out.println(Thread.currentThread().getName() + "--" + Thread.activeCount());
                try {
                    commonSection();
                } catch (InterruptedException ex) {
                    Logger.getLogger(SingcomUC1SerialRunnableThreadClass.class.getName()).log(Level.SEVERE, null, ex);
                }
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException ex) {
                    Logger.getLogger(SingcomUC1SerialRunnableThreadClass.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
            if (threadName.equalsIgnoreCase(singcomUC1Writethread)) {
                System.out.println(Thread.currentThread().getName() + "--" + Thread.activeCount());
                try {
                    commonSection();
                    Thread.sleep(300);
                } catch (InterruptedException ex) {
                    Logger.getLogger(SingcomUC1SerialRunnableThreadClass.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
        }
    }

    public void commonSection() throws InterruptedException {
        InsertValuesIntoUC1DBtable.insertDefaultValueAndStatusIntoUC1DBtable(singcomUC1DeviceId);
        ReadOrUpdateUC1CONTROLtable.insertDefaultValueAndStatusIntoDC1DBtable(singcomUC1DeviceId);
    }
}

public class InsertValuesIntoUC1DBtable {

    public static void insertDefaultValueAndStatusIntoUC1DBtable(int deviceid) {
        try {
            Connection con = null;
            DatabaseConnection databaseConnection_obj = new DatabaseConnection();
            con = databaseConnection_obj.getConnection();
            PreparedStatement pst = con.prepareStatement("select * from uc1db");
            ResultSet rs = pst.executeQuery();
            if (!rs.next()) {
                pst = con.prepareStatement("insert into uc1db(deviceid,frequency,attenuation,transmitterstatus,devicestatus) values(?,?,?,?,?)");
                pst.setInt(1, deviceid);
                pst.setString(2, "0");
                pst.setString(3, "0");
                pst.setString(4, "0");
                pst.setString(5, "online");
                pst.executeUpdate();
            }
            rs.close();
            pst.close();
            con.close();
        } //**
        catch (SQLException ex) {
            Logger.getLogger(InsertValuesIntoUC1DBtable.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
}

public class DatabaseConnection {

    public Connection getConnection() {
        Connection con = null;
        try {
            Class.forName("com.mysql.jdbc.Driver");
            con = DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "root", "admin");
        } catch (Exception e) {
            System.out.println(" Db Exception  " + e);
        }
        return con;
    }
}

输出:

active thread count=3
run() invokations
run() invokations
singcomUC1ReadThread--2
singcomUC1WriteThread--2
singcomUC1WriteThread--4
singcomUC1WriteThread--4

最佳答案

那么,您问的那些难以捉摸的线索是什么?

您可以通过运行 Thread.currentThread().getThreadGroup().list() 获得一些见解

输出可能如下所示:

java.lang.ThreadGroup[name=main,maxpri=10]
    Thread[READ_THREAD,5,main]
    Thread[Write_THREAD,5,main]
    Thread[DestroyJavaVM,5,main]
    Thread[mysql-cj-abandoned-connection-cleanup,5,main]

您可能认识前两个。

DestroyJavaVM 是一个维护线程,可确保所有其他线程在终止 VM 之前已完成。

mysql-cj-abandoned-connection-cleanup 非常相似,但是针对 MySQL Connector。

请注意,您不应该担心这些维护线程。它们通常是由非常熟练的人编写的,以确保这些线程不会影响应用程序的性能。您应该更担心的是您自己的线程,更具体地说,不使用线程池来管理它们。

关于java - 在mysql中插入记录导致线程数增加,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54322730/

相关文章:

java - 如何在冒泡排序中对随机数进行排序

java - JTextField 中字符串的 If 语句

java - Spring集成FileTailingMessageProducer : Remember current line when restarting

ios - 重新路由期间Skobbler API的问题

c++ - 使用 Boost 的 C++ 中的多线程之谜

java - 如何使用 Spring MVC 返回文本文件?

mysql - MySQL中如何对多个条件的结果进行排序

具有多个左外连接的 Mysql 案例

mysql - 错误 1329 : No data - zero rows fetched, 选择或处理 - 即使一切都正确完成

java - Java Spring Boot 会以线程安全的方式在 Redis 中设置和获取值吗?