List<A> listA = getListA();
List<P> listP = getListP();
for (int i = 0; i < listP.size(); i++) {
  P p = listP.get(i);
  doSomeThing(p, listA);
}假设listP的size为10,执行一次doSomeThing方法需要1分钟,那10次就要10分钟。
可不可以用线程同时执行10次doSomeThing方法,只用1分钟完成循环里的操作?

解决方案 »

  1.   

    把doSomeThing放到一个线程里面就行了,线程的构造函数用到p和listA就像这样:
    public class TestThread extends Thread
    {
      private P p;
      private List<A> listA;  public TestThread(P p, List<A> listA)
      {
        this.p = p;
        this.listA = listA;
      }  public void run()
      {
         doSomeThing(p, listA);
      }
    }
    原先的函数写成:
    List<A> listA = getListA();
    List<P> listP = getListP();
    Thread[] threads = new Thread[listP.size()];  //用来保存线程对象的
    for (int i = 0; i < listP.size(); i++) {
      P p = listP.get(i);
      threads[i] = new TestThread(p, listA);
      threads[i].start();
    }
    for (int i = 0; i < listP.size(); i++)
    {
      threads[i].join();   //当所有线程都结束后才继续执行
    }
    这样就可以把原来要干10分钟的事在1分钟内干完了
      

  2.   

    对于单CPU来说,多线程并不能提高执行速度,反而是减慢了。
    一个线程执行需要10分钟,十个线程执行肯定比10分钟要慢,因为要做线程同步。
    吃一个面包,要10分钟;把这个面包切成十份,一个一个轮流咬一口的吃,一分钟就能吃完吗?肯定不会嘛。
      

  3.   

    3楼对多线程的理解也太狭隘了吧。多线程跟CPU的个数没有关系。CPU的调度是由底层实现的。多线程技术主要是增加CPU的占用率。用任务管理器看一下cpu的占用率就会发现,大多数时间cpu的占用率都较低。也就是说CPU闲得很,空闲时间可以做很多事情。比如服务器端的程序肯定是多线程的。不能一个人访问,全家人都等着吧。
      

  4.   

    其实还是要看情况的。
    “执行一个方法要10分钟”,那么执行过程中是一直占用CPU吗?还是涉及到一些I/O操作呢?
    如果是一直占用CPU的话,那么在单CPU的情况下,采用时间片轮转等方法来实现反而会降低效率,因为涉及到一些调度的开销
    如果期间有I/O等操作,也就是说着10分钟内CPU有空闲的,那么当然采用多线程调度会降低时间,提高效率。
      

  5.   

    硬件底层是并行的,不要吧CPU理解为一个服务员,要理解为10个。你的一个线程就给你分配一个服务员。3个线程就分配3个。当然可以提高执行速度。只有超过10个时,CPU才可能手忙脚乱。你一个单线程的程序CPU会给你分配10个服务员吗?
      

  6.   

    执行一个方法要一分钟,但根据CPU的性能比如四线程或更高配置,同时运行10个线程的时间就会大大缩短!
      

  7.   

    如果执行时间确实比较很长,可以考虑用CountDownLatch,如果doSomething涉及到修改list,那么listA需要修改为同步ConcurrentLinkedList.多线程一定要根据实际情况使用,很多时候是没有必要的。
    下面给个简单的代码:
    CountDownLatch countDown = new CountDownLatch(listP.size());
    Executor executor = Executors.newCachedThreadPool();
    for(int i = 0, len = listP.size(); i < len; i++) {
        executor.execute(new MRunnable(listP.get(i)));
    } class MRunnable implements Runnable {
        public void run(){
            doSomething();
            countDown.countDown();
        }
    }
      

  8.   

    支持3楼,对于单核在cpu确实如此,单核的cpu是怎么进行多线程的?四楼知道吗?,单核的cpu就是进行多线程之间的切换,这个切换自然也是需要资源在的,所以效率反而会降低。
    但如果是多核的cpu,那自然是提高了效率,单核就是一个人做10件事,多核就是多个人做10件事,自然是多核的快了。
      

  9.   

    我觉得4楼的理解有点错误。CPU与多线程是没有关系,但是要提高执行的速度就和多线程有关系了。如果是单CPU ,就算你线程再多,不算线程之间的切换,最快也就线性的速度,一个时间你只能执行一个线程的代码块,如果是多核的,那么可以在同一时间执行多个线程。