我的项目:
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();的时候才会阻塞主线程
结果图: