这里有两种编写示例代码的方法(一种使用多线程,一种不用多线程)--原始代码(朋友编写的)使用多线程。我想知道哪种方法更好,在这种情况下是否有使用多线程的动机?
主要班:
public class main
{
public static void main(String[] args)
{
MyWorker worker1 = new MyWorker();
}
}
MyWorker类:
import java.util.HashMap;
import java.util.LinkedList;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class MyWorker
{
HashMap<String, Integer> HM_1, HM_2, HM_both;
ExecutorService threadExecutor;
LinkedList<String> myStrings_1;
LinkedList<String> myStrings_2;
public MyWorker()
{
myStrings_1 = new LinkedList<String>();
myStrings_1.add("Letter A");
myStrings_1.add("Letter B");
myStrings_1.add("Letter C");
myStrings_2 = new LinkedList<String>();
myStrings_2.add("Letter D");
myStrings_2.add("Letter E");
myStrings_2.add("Letter F");
threadExecutor = Executors.newFixedThreadPool(10);
HM_1= new HashMap<String, Integer>();
HM_2 = new HashMap<String, Integer>();
HM_both = new HashMap<String, Integer>();
for(Object o_1: myStrings_1.toArray())
{
// multi-threading
String f_1 = (String)o_1;
threadExecutor.execute(new Helper(this, f_1, true));
}
for(Object o_2: myStrings_2.toArray())
{
// multi-threading
String f_2 = (String)o_2;
threadExecutor.execute(new Helper(this, f_2, false));
}
threadExecutor.shutdown();
}
public void getWorkerData(String f, boolean b, int currNum)
{
if(b)
{
HM_1.put(f, currNum);
HM_both.put(f, currNum);
}
else
{
HM_2.put(f, currNum);
HM_both.put(f, currNum);
}
}
}
帮助班:
public class Helper implements Runnable
{
public MyWorker currWorker1;
public String s;
public boolean b;
public Helper(MyWorker _currWorker1, String _s, boolean _b)
{
s = _s;
currWorker1 = _currWorker1;
b = _b;
}
public void run()
{
currWorker1.getWorkerData(s, b, 12);
}
}
main_noThreading类:
public class main_noThreading
{
public static void main(String[] args)
{
MyWorker_noThreading worker1 = new MyWorker_noThreading();
}
}
MyWorker_noThreading:
import java.util.HashMap;
import java.util.LinkedList;
public class MyWorker_noThreading
{
HashMap<String, Integer> HM_1, HM_2, HM_both;
LinkedList<String> myStrings_1;
LinkedList<String> myStrings_2;
public MyWorker_noThreading()
{
myStrings_1 = new LinkedList<String>();
myStrings_1.add("Letter A");
myStrings_1.add("Letter B");
myStrings_1.add("Letter C");
myStrings_2 = new LinkedList<String>();
myStrings_2.add("Letter E");
myStrings_2.add("Letter F");
myStrings_2.add("Letter G");
HM_1 = new HashMap<String, Integer>();
HM_2 = new HashMap<String, Integer>();
HM_both = new HashMap<String, Integer>();
for(Object o_1: myStrings_1.toArray())
{
// no multi-threading
String f_1 = (String)o_1;
new Helper_noThreading(this, f_1, true);
}
for(Object o_2: myStrings_2.toArray())
{
// no multi-threading
String f_2 = (String)o_2;
new Helper_noThreading(this, f_2, false);
}
}
public void getWorkerData(String f, boolean b, int currNum)
{
if(b)
{
HM_1.put(f, currNum);
HM_both.put(f, currNum);
}
else
{
HM_2.put(f, currNum);
HM_both.put(f, currNum);
}
}
}
MyHelper_noThreading类:
public class Helper_noThreading
{
public MyWorker_noThreading currWorker1;
public String s;
public boolean b;
public Helper_noThreading(MyWorker_noThreading _currWorker1, String _s, boolean _b)
{
s = _s;
currWorker1 = _currWorker1;
b = _b;
currWorker1.getWorkerData(s, _b, 12);
}
}
发布于 2012-04-17 07:17:43
我只是评论您发布的代码的线程部分,关于这些部分,我要说多线程代码编写得不正确。线程写入的数据结构中没有一个是线程安全的,也没有维护线程安全的锁定机制。
就性能而言,也绝对没有理由对此代码进行多线程处理。目前没有任何系统调用或复杂计算可以从并行运行中受益。
至于您的问题,我想说的是,非多线程解决方案更好(虽然您肯定可以简化一些代码)。
https://codereview.stackexchange.com/questions/10940
复制相似问题