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


利用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测试

猜你喜欢

转载自blog.csdn.net/xiao466068504/article/details/78355002