java 并发之awaitTermination的使用

 public static ExecutorService executorService = Executors.newFixedThreadPool(10);

    public static void main(String[] args) throws InterruptedException {
        for (int i = 0; i < 100; i++) {
            executorService.submit(() -> {
                System.out.println(Thread.currentThread().getName());
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            });

        }
        System.out.println("开始等待");
        boolean b = executorService.awaitTermination(3, TimeUnit.SECONDS);
        System.out.println("等待完毕");
        if(b){
            System.out.println("分线程已经结束");
        }
        System.out.println(Thread.currentThread().getName());
    }

当使用awaitTermination时,主线程会处于一种等待的状态,等待线程池中所有的线程都运行完毕后才继续运行。

boolean b = executorService.awaitTermination(3, TimeUnit.SECONDS);

第一个参数指定的是时间,第二个参数指定的是时间单位(当前是秒)。返回值类型为boolean型。

1️⃣如果等待的时间超过指定的时间,但是线程池中的线程运行完毕,那么awaitTermination()返回true。执行分线程已结束。

2️⃣如果等待的时间超过指定的时间,但是线程池中的线程未运行完毕,那么awaitTermination()返回false。不执行分线程已结束。

3️⃣如果等待时间没有超过指定时间,等待!


可以用awaitTermination()方法来判断线程池中是否有继续运行的线程。

### 回答1: 好的,以下是一个示例代码,它实现了多个线程同时写入同一个文件: ``` import java.io.FileWriter; import java.io.IOException; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class ConcurrentFileWriter { private final static int THREAD_COUNT = 10; private final static String FILE_NAME = "concurrent_file.txt"; public static void main(String[] args) { ExecutorService executorService = Executors.newFixedThreadPool(THREAD_COUNT); for (int i = 0; i < THREAD_COUNT; i++) { final int index = i; executorService.submit(() -> { try (FileWriter fileWriter = new FileWriter(FILE_NAME, true)) { for (int j = 0; j < 100; j++) { fileWriter.write("Thread " + index + ": Line " + j + "\n"); } } catch (IOException e) { e.printStackTrace(); } }); } executorService.shutdown(); } } ``` 这段代码创建了 10 个线程,每个线程写入文件 `concurrent_file.txt` 100 行数据。注意,由于文件是被多个线程写入,因此文件内容可能是无序的。 ### 回答2: 下面是一个使用Java并发写入文件的示例代码: ```java import java.io.BufferedWriter; import java.io.FileWriter; import java.io.IOException; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; public class ConcurrentFileWriter { private static final String FILE_PATH = "output.txt"; private static final int NUM_THREADS = 10; private static final int NUM_TASKS = 100; public static void main(String[] args) { ExecutorService executor = Executors.newFixedThreadPool(NUM_THREADS); for (int i = 0; i < NUM_TASKS; i++) { final int taskNumber = i; executor.execute(() -> { String content = "This is task number " + taskNumber + "\n"; writeToFile(content); }); } executor.shutdown(); try { executor.awaitTermination(Long.MAX_VALUE, TimeUnit.NANOSECONDS); } catch (InterruptedException e) { e.printStackTrace(); } } private static synchronized void writeToFile(String content) { try (BufferedWriter writer = new BufferedWriter(new FileWriter(FILE_PATH, true))) { writer.write(content); } catch (IOException e) { e.printStackTrace(); } } } ``` 该代码创建了一个固定大小的线程池,通过`ExecutorService`管理线程。`NUM_THREADS`和`NUM_TASKS`分别表示线程池中的线程数量和要执行的任务数量。 在主循环中,通过调用`executor.execute()`方法,将待写入文件的任务提交给线程池执行。每个任务都会生成一段内容并调用`writeToFile()`方法将内容写入文件中。 在`writeToFile()`方法中,使用`synchronized`关键字来确保多个线程之间的互斥访问,避免并发写入导致的问题。 最后,当所有任务都执行完毕后,调用`executor.shutdown()`关闭线程池,并通过`executor.awaitTermination()`等待所有任务执行完成。 注意:由于在`writeToFile()`方法中使用了`synchronized`关键字,可能会影响性能。在实际应用中,可以考虑使用更高效的并发写入方式,例如使用`java.util.concurrent.locks.Lock`实现精确控制。 ### 回答3: 以下是一个使用Java并发编写文件的示例代码: ```java import java.io.*; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class ConcurrentFileWriter { public static void main(String[] args) { // 创建一个具有10个线程的线程池 ExecutorService executorService = Executors.newFixedThreadPool(10); // 定义要写入的数据 String data = "Hello, World!"; // 创建10个任务同时写入文件 for (int i = 1; i <= 10; i++) { int fileNumber = i; executorService.execute(() -> writeFile("file_" + fileNumber + ".txt", data)); } // 关闭线程池 executorService.shutdown(); } private static void writeFile(String fileName, String data) { try { BufferedWriter writer = new BufferedWriter(new FileWriter(fileName)); writer.write(data); // 模拟写入数据需要一些时间 Thread.sleep(1000); writer.close(); System.out.println("写入文件成功:" + fileName); } catch (IOException | InterruptedException e) { e.printStackTrace(); } } } ``` 在上面的代码中,我们创建了一个具有10个线程的线程池,然后定义了要写入的数据为"Hello, World!"。接下来,我们使用循环创建了10个任务,每个任务使用线程池并行地执行。每个任务会调用`writeFile`方法来写入文件。 在`writeFile`方法中,我们使用`BufferedWriter`和`FileWriter`来打开文件并写入数据。为了模拟写入操作需要一些时间,我们在写入数据之后使用`Thread.sleep(1000)`方法来暂停1秒钟。最后,关闭文件,并打印写入文件成功的信息。 这样,我们便可以通过并发的方式将数据写入多个文件中。
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值