1. 程式人生 > >junit測試和main方法多執行緒中遇到的問題

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測試