【发布时间】:2016-06-24 21:20:27
【问题描述】:
我有一个非常简单的类,可以将列表异步写入文件:
import java.io.FileWriter;
import java.io.IOException;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.atomic.AtomicInteger;
import com.google.common.reflect.TypeToken;
import com.google.gson.Gson;
public enum FileOps {
INSTANCE;
private ExecutorService threadPool = Executors.newFixedThreadPool(30);
private AtomicInteger fileCount = new AtomicInteger(0);
private <T> void writeListToFile(String fileName, List<T> obj) {
FileWriter writer = null;
Type tType = new TypeToken<ArrayList<T>>() {
private static final long serialVersionUID = 4376511240656742709L;
}.getType();
Gson gson = new Gson();
try {
writer = new FileWriter(fileName);
writer.append(gson.toJson(obj, tType));
writer.flush();
} catch (Exception e) {
} finally {
try {
writer.close();
} catch (IOException e) {
}
}
}
public <T> void asynWriteListToFile(List<T> obj){
threadPool.execute(new Runnable() {
@Override
public void run() {
String fileName = "C:\\data\\" + fileCount.incrementAndGet() + "_data.txt";
System.out.println(fileName);
FileOps.INSTANCE.writeListToFile(fileName, obj);
}
});
}
}
我已经使用 TestNg 为这个类编写了一个单元测试
import java.util.ArrayList;
import java.util.List;
import org.testng.annotations.Test;
public class FileOpsTest {
@Test
public void asynWriteListToFile() {
List<Integer> list = new ArrayList<>();
list.add(3);
for (int i = 0; i < 10000; i++) {
FileOps.INSTANCE.asynWriteListToFile(list);
}
}
}
我的情况很奇怪。在我的 TestNg 执行中,测试引擎如何不等待子线程完成。所以我期望在磁盘上写入 10000 个文件,但每次我看到磁盘上写入的文件更少。但是,如果我使用 main 方法编写客户端,则一切正常。
import java.util.ArrayList;
import java.util.List;
public class FileOpsClient {
public static void main(String[] args) {
List<Integer> list = new ArrayList<>();
list.add(3);
for (int i = 0; i < 10000; i++) {
FileOps.INSTANCE.asynWriteListToFile(list);
}
}
}
testNg 引擎不知何故关闭了我的线程池。
【问题讨论】:
标签: java multithreading testng