您的位置:首页 > 大数据 > 人工智能

junit测试和main方法多线程中遇到的问题

2017-10-26 16:03 393 查看
利用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测试
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  junit main+ 多线程