我的項目:
nanshaws/nettyWeb: 復習一下netty,并打算做一個web項目出來 (github.com)
最近在項目中分別添加了虛擬線程操作mysql數據庫,和用協程操作mysql數據庫
同理先跟我這個博客操作一下前面的:就單純代碼的時候進行修改:
如何用java的虛擬線程連接數據庫-CSDN博客
完整代碼:
package org.tianfan.mysqlTest;import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;public class Test002 {static String name = "root";static String password = "123456";static final String JDBC_DRIVER = "com.mysql.cj.jdbc.Driver";static final String DB_URL = "jdbc:mysql://localhost:3306/itheima?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC";public static void main(String[] args) throws ExecutionException, InterruptedException {CompletableFuture<Connection> coroutine1 = CompletableFuture.supplyAsync(() -> {// 協程1的執行邏輯Connection conn = null;Statement stmt = null;try {// 注冊 JDBC 驅動Class.forName(JDBC_DRIVER);// 打開鏈接System.out.println("連接數據庫...");conn = DriverManager.getConnection(DB_URL, name, password);System.out.println("連接成功...");}catch (Exception e){e.printStackTrace();}return conn;});CompletableFuture<String> coroutine2 = CompletableFuture.supplyAsync(() -> {// 協程2的執行邏輯return "進行數據庫操作";});/*** 其他耗時操作*/Connection connection = coroutine1.get();System.out.println(coroutine2.get()); // 輸出:Coroutine 2 finished.}
}
這樣做的好處就是不會在執行協程1的時候,不會阻塞主線程,直到主線程使用coroutine1.get();的時候才會阻塞主線程
結果圖: