Java多线程快速查找22222222后1000个连续质数并存储到数据库
下面是一个使用多线程机制来寻找数字'22222222'后1000个连续的质数并将结果插入到数据库表't_prime_number'的示例代码:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
public class PrimeNumberFinder {
    private static final int NUM_THREADS = 10;
    private static final long TARGET_NUMBER = 22222222L;
    private static final int NUM_PRIMES = 1000;
    private static final String DB_URL = "jdbc:mysql://localhost:3306/mydb";
    private static final String DB_USERNAME = "username";
    private static final String DB_PASSWORD = "password";
    private static List<Long> primeNumbers = new ArrayList<>();
    public static void main(String[] args) throws InterruptedException, SQLException {
        // 创建数据库连接
        Connection connection = DriverManager.getConnection(DB_URL, DB_USERNAME, DB_PASSWORD);
        // 创建线程列表
        List<PrimeNumberThread> threads = new ArrayList<>();
        // 创建并启动线程
        for (int i = 0; i < NUM_THREADS; i++) {
            PrimeNumberThread thread = new PrimeNumberThread(i, connection);
            threads.add(thread);
            thread.start();
        }
        // 等待线程执行完成
        for (PrimeNumberThread thread : threads) {
            thread.join();
        }
        // 关闭数据库连接
        connection.close();
    }
    static class PrimeNumberThread extends Thread {
        private int threadId;
        private Connection connection;
        public PrimeNumberThread(int threadId, Connection connection) {
            this.threadId = threadId;
            this.connection = connection;
        }
        @Override
        public void run() {
            long startNumber = TARGET_NUMBER + threadId;
            long currentNumber = startNumber;
            int primesFound = 0;
            long startTime = System.currentTimeMillis();
            while (primesFound < NUM_PRIMES) {
                if (isPrime(currentNumber)) {
                    synchronized (primeNumbers) {
                        primeNumbers.add(currentNumber);
                    }
                    primesFound++;
                }
                currentNumber++;
            }
            long endTime = System.currentTimeMillis();
            long elapsedTime = endTime - startTime;
            try {
                // 将结果插入到数据库表't_prime_number'
                PreparedStatement statement = connection.prepareStatement("INSERT INTO t_prime_number (number, thread_id, elapsed_time) VALUES (?, ?, ?)");
                for (long primeNumber : primeNumbers) {
                    statement.setLong(1, primeNumber);
                    statement.setInt(2, threadId);
                    statement.setLong(3, elapsedTime);
                    statement.addBatch();
                }
                statement.executeBatch();
                statement.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        private boolean isPrime(long number) {
            if (number <= 1) {
                return false;
            }
            for (long i = 2; i <= Math.sqrt(number); i++) {
                if (number % i == 0) {
                    return false;
                }
            }
            return true;
        }
    }
}
要素说明:
A、最快的要素是使用多线程机制,并行计算质数。通过将质数的计算任务分配给多个线程并行执行,可以加快计算速度。
B、代码中使用PreparedStatement将计算得到的质数插入到数据库表't_prime_number'中,并记录了质数数值、计算此质数的线程ID、计算出此质数的用时毫秒数。
C、代码中没有实现按升序记录质数到表里,如果需要按升序记录,可以在插入数据到数据库之前对质数列表进行排序。
原文地址: https://www.cveoy.top/t/topic/qFEh 著作权归作者所有。请勿转载和采集!