首页 > 解决方案 > Java 使用线程更高效地处理字符串

问题描述

我有这个类使用线程来处理字符串,目前,它是错误的,因为它与每个线程处理相同的数据,我如何转换这个类以更有效地处理字符串
这个类模拟了我面临的问题:

class TransformA implements MyWork.StringWork {

    @Override
    public String mixStr(String str) {
        return str+" Im mixStrA";
    }
}

class TransformB implements MyWork.StringWork {

    @Override
    public String mixStr(String str) {
        return str+" Im mixStrB";
    }
}

public class MyWork {
    private List<String> strResult = new ArrayList<String>();
    public MyWork(List<String> startingData) {
        this.strResult = startingData;
    }
    private void processStrings(StringWork f) {
        
        List<String> newData = new ArrayList<String>();
        for (String str : strResult) {
            newData.add(f.mixStr(str));
        }
        strResult = newstrResult;
        
    }
    public List<String> process(List<StringWork> functions) throws
            InterruptedException {
        List<Thread> threads = new ArrayList<Thread>();
        for (final StringWork f : functions) {
            threads.add(new Thread(new Runnable() {
                @Override
                public void run() {                    
                    processStrings(f);
                }
            }));
        }
         
        for (Thread t : threads) {
            t.start();
        }
        for (Thread t : threads) {
            t.join();
        }
        return strResult;
    }
    public interface StringWork {
        public String mixStr(String str);
    }

    public static void main(String[] args) {
        List<MyWork.StringWork> functions = new ArrayList<>();
        functions.add(new TransformA());
        functions.add(new TransformB());

        List<String> startingData = new ArrayList<String>();
        startingData.add("XXXX");
        startingData.add("YYYY");
        startingData.add("AAAA");
        startingData.add("BBBB");
        startingData.add("CCCC");
        startingData.add("DDDDD");

        MyWork myWork = new MyWork(startingData);
        try {
            List<String> result = MyWork.process(functions);
            //System.out.println(String.join("\n",result));
        } catch (InterruptedException e) {
            e.printStackTrace();
        }


    }
}

标签: javamultithreading

解决方案


推荐阅读