вставка записей в MySQL, приводящая к увеличению количества потоков - PullRequest
0 голосов
/ 23 января 2019

Я создал два потока «READ_THREAD» и «WRITE_THREAD», которые работают непрерывно с некоторым интервалом ожидания, как показано в приведенном ниже коде.Когда я запускаю этот код без запроса на вставку базы данных и количества потоков печати, он всегда дает 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

1 Ответ

0 голосов
/ 23 января 2019

Итак, что за неуловимые темы вы спрашиваете?

Вы можете получить некоторые идеи, запустив 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 - это поток обслуживания, который проверяет, что все остальные потоки завершили работу перед завершением работы виртуальной машины.

mysql-cj-abandoned-connection-cleanup очень похож, но для MySQL Connector.

Обратите внимание, что вы не должны беспокоиться об этих потоках обслуживания. Обычно их пишут очень опытные люди, которые следят за тем, чтобы эти потоки не влияли на производительность вашего приложения. Больше всего вас должны беспокоить ваши собственные потоки, а точнее, не использовать пул потоков для управления ими.

...