junit測試和main方法多執行緒中遇到的問題
阿新 • • 發佈:2018-11-04
利用Junit測試多執行緒時經常遇到任務執行不完就會停止,下面是我的任務執行緒類:
package timerTest;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.Map.Entry;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
/**
*
* created on 2017年10月26日
*
* @author zhujixiang
* @version 1.0
* @since JDK 1.8.0_112
*/
public class TaskDemo implements Runnable {
public TaskDemo () {
super();
// TODO Auto-generated constructor stub
}
private File file;
public TaskDemo(File file) {
super();
this.file = file;
}
@Override
public void run() {
try {
BufferedReader br = new BufferedReader(new FileReader(file));
File dir = new File(file.getParent() + "\\" + file.getName().replace(".txt", ""));
System.out.println(Thread.currentThread().getName() + "=======" + dir);
if (!dir.exists()) {
dir.mkdirs();
}
String string = null;
while ((string=br.readLine())!=null) {
//JSONObject json = JSONObject.fromObject(string);
System.out.println(string);
outFile(string, dir);
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void outFile(String string, File dir) throws Exception {
//JSONObject json = JSONObject.fromObject(string);
Map<String, Object> map = (Map<String, Object>) JSON.parse(string);
Set<Entry<String, Object>> set = map.entrySet();
List<String> keyList = new ArrayList<>();
// 查詢出所有的key值,排除Id欄位;並把有效key值存入list;
for (Entry<String, Object> entry : set) {
Object value = entry.getValue();
// System.out.println(value.toString());
if (value.toString().length() != 7) {
keyList.add(entry.getKey());
}
}
// 遍歷keylist 每個key是一張表,為每一張表建立一個檔案
for (String tableName : keyList) {
// 建立檔案
/*
* File file=new File(dir); if (!file.exists()) { file.mkdirs(); }
*/
File f = new File(dir, tableName + ".txt");
// 使用字元緩衝流增加效率
BufferedWriter out = new BufferedWriter(new FileWriter(f));
// 根據表名獲取所有的欄位以及值的list集合
Object object = map.get(tableName);
List<Map> list2 = JSONArray.parseArray(object.toString(), Map.class);
String str = "";
System.out.println(tableName);
// 遍歷list集合得到所有欄位的值 拼接字串
for (Map map2 : list2) {
Collection values = map2.values();
for (Object object2 : values) {
str += object2 + ",";
}
str = str.substring(0, str.length() - 1);
str += "\r";
}
str = str.substring(0, str.length() - 1);
// 把字串寫進檔案
out.write(str);
out.close();
}
}
}
**利用Junit測試執行執行緒任務時就會發生任務執行不完就無緣無故的停止,下面是Junit測試程式碼:**
@Test
public void test() {
File f=new File("D:\\img");
File[] files = f.listFiles();
ExecutorService service = Executors.newFixedThreadPool(5);
for (File file2 : files) {
if(file2.getName().endsWith(".txt")){
TaskDemo td=new TaskDemo(file2);
Thread t=new Thread(td);
//t.start();
service.submit(t);
}
}
service.shutdown();
}
然後我又用main方法重新執行了一次多執行緒任務,就不會有無緣無故停止的問題,main方法呼叫多執行緒的程式碼:
public static void main(String[] args) throws Exception {
Timer timer=new Timer();
timer.schedule(new TimerTask(){
@Override
public void run() {
System.out.println(new Date().toLocaleString()+"=======================================");
File f=new File("D:\\img");
File[] files = f.listFiles();
ExecutorService service = Executors.newFixedThreadPool(5);
for (File file2 : files) {
if(file2.getName().endsWith(".txt")){
TaskDemo td=new TaskDemo(file2);
Thread t=new Thread(td);
//t.start();
service.submit(t);
}
}
service.shutdown();
}
},2000,4000);
//run2();
}
最後查了好多文章資料還看了原始碼,得出結論Junit測試時也是用的main方法 main方法停止執行緒就會停止,所以多執行緒時慎用Junit測試