并行执行(Callable和Future)一定比串行执行效率高吗?

在一个程序里顺序调用了两个不相关的方法A和B,A耗时100毫秒,B耗时80毫秒,所以总共耗时180毫秒。

main(){

methodA;

methodB;

}

因为方法A和B不相关,所以我们可以将程序改造成并行执行,使用Callable和Future配合实现(只讨论需要A和B的返回值的情况)。

main(){

ExecutorService executor = Executors.newFixedThreadPool(2);
Future<JSONObject> future1 = executor.submit(new Callable<JSONObject>() {
                @Override
                public JSONObject call() throws Exception {
                    return methodA;
                }
            });
Future<Integer> future2 = executor.submit(new Callable<Integer>() {
                @Override
                public Integer call() throws Exception {
                    return methodB
                }
            });
executor.shutdown();

JSONObject r1 = future1.get();
int r2 = future2.get();

}

因为是并行执行,所以理论上,执行时间总共是100毫秒(取两个方法中耗时最大的)+异步线程自身的消耗时间

经过试验,异步线程自身的消耗时间大约是200毫秒,这样并行执行的总时间就是300毫秒,大于串行执行的180毫秒。

可见并行执行不一定比串行执行效率高。对于耗时很少的方法来说,选择顺序执行既简单又高效。

当至少有两个方法的耗时都超过200毫秒时,采用并行执行的优势才显露出来。


  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以使用Java中的JDBC API连接MySQL数据库,然后使用串行和并行两种方式读取数据并将其写入文本文档。 1. 串行方式读取MySQL数据并写入文本文档 ```java import java.io.BufferedWriter; import java.io.FileWriter; import java.io.IOException; import java.sql.*; public class SerialReadDataToText { public static void main(String[] args) { String url = "jdbc:mysql://localhost:3306/test"; String user = "root"; String password = "123456"; String sql = "SELECT * FROM table_name"; try (Connection conn = DriverManager.getConnection(url, user, password); Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery(sql)) { BufferedWriter writer = new BufferedWriter(new FileWriter("data.txt")); while (rs.next()) { String data = rs.getString("column_name"); writer.write(data); writer.newLine(); } writer.close(); } catch (SQLException | IOException e) { e.printStackTrace(); } } } ``` 2. 并行方式读取MySQL数据并写入文本文档 ```java import java.io.BufferedWriter; import java.io.FileWriter; import java.io.IOException; import java.sql.*; import java.util.ArrayList; import java.util.List; import java.util.concurrent.*; public class ParallelReadDataToText { public static void main(String[] args) { String url = "jdbc:mysql://localhost:3306/test"; String user = "root"; String password = "123456"; String sql = "SELECT * FROM table_name"; ExecutorService executorService = Executors.newFixedThreadPool(4); List<Future<String>> futures = new ArrayList<>(); try (Connection conn = DriverManager.getConnection(url, user, password); Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery(sql)) { while (rs.next()) { String data = rs.getString("column_name"); Callable<String> task = () -> data; futures.add(executorService.submit(task)); } BufferedWriter writer = new BufferedWriter(new FileWriter("data.txt")); for (Future<String> future : futures) { String data = future.get(); writer.write(data); writer.newLine(); } writer.close(); } catch (SQLException | IOException | InterruptedException | ExecutionException e) { e.printStackTrace(); } finally { executorService.shutdown(); } } } ``` 以上代码仅供参考,实际应用中需要根据具体情况进行修改。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值