首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在这段代码中多线程的动机是什么?

在这段代码中多线程的动机是什么?
EN

Code Review用户
提问于 2012-04-17 04:22:07
回答 1查看 399关注 0票数 2

这里有两种编写示例代码的方法(一种使用多线程,一种不用多线程)--原始代码(朋友编写的)使用多线程。我想知道哪种方法更好,在这种情况下是否有使用多线程的动机?

1)第一条路径(多线程):

主要班:

代码语言:javascript
运行
复制
public class main 
{
    public static void main(String[] args)
    {   
        MyWorker worker1 = new MyWorker();       
    }
}

MyWorker类:

代码语言:javascript
运行
复制
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);
        }
    }
}

帮助班:

代码语言:javascript
运行
复制
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);
    }
}

2)第二种方式(没有多线程):

main_noThreading类:

代码语言:javascript
运行
复制
public class main_noThreading
{
    public static void main(String[] args)
    {   
        MyWorker_noThreading worker1 = new MyWorker_noThreading();       
    }
}

MyWorker_noThreading:

代码语言:javascript
运行
复制
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类:

代码语言:javascript
运行
复制
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);
    }
}
EN

回答 1

Code Review用户

回答已采纳

发布于 2012-04-17 07:17:43

我只是评论您发布的代码的线程部分,关于这些部分,我要说多线程代码编写得不正确。线程写入的数据结构中没有一个是线程安全的,也没有维护线程安全的锁定机制。

就性能而言,也绝对没有理由对此代码进行多线程处理。目前没有任何系统调用或复杂计算可以从并行运行中受益。

至于您的问题,我想说的是,非多线程解决方案更好(虽然您肯定可以简化一些代码)。

票数 5
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/10940

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档