//开始
for (int i = 0; i < fList.size(); i++) {

final List<FndMenuEntriesIntDto> sortList = fndMenuEntriesIntDao.getListByMenuId(fList.get(i).getMenuId(), versionId); new Thread(new Runnable() {
@Override
//线程1
public void run() {
for (int i = 0; i < sortList.size(); i++) {
doSomeThing1();
}
}
}).start(); new Thread(new Runnable() {
@Override
    //线程2
public void run() {
for (int i = 0; i < sortList.size(); i++) {
doSomeThing2();
}
}
}).start();
}}doSomeThing1();和doSomeThing2();里执行的业务不一样,所需的时间也不同。
开始的循环处会等线程1和线程2都执行完再执行下一次循环码?

解决方案 »

  1.   

    不会等。  可以用log打印看看。当然要数据多一点。
      

  2.   

    不会等,线程启动完后,当前循环结束,进入下一次循环.又去启动新的线程。每个线程的 doSomeThing1();和doSomeThing2() 什么时候运行,要靠jvm调度了。
      

  3.   

    线程启动就表示.start()函数执行完了,而不必等到线程中的指令执行完
      

  4.   

    循环处就是主线程。要想等子线程结束,得调用子线程的join()方法
      

  5.   


        final List<FndMenuEntriesIntDto> sortList = fndMenuEntriesIntDao.getListByMenuId(fList.get(i).getMenuId(), versionId);           Thread th1 =  new Thread(new Runnable() {
                    @Override
                    //线程1
                    public void run() {                
                        for (int i = 0; i < sortList.size(); i++) {
                            doSomeThing1();
                        }
                    }
                });
    th1.start();
    th1.join();
                Thread th2 = new Thread(new Runnable() {
                    @Override
                    //线程2
                    public void run() {
                        for (int i = 0; i < sortList.size(); i++) {
                            doSomeThing2();
                        }
                    }
                });
    th2.start();
    th2.join();
            }这样的话就可以了吗?
      

  6.   

    使用FutureTask处理多线程的返回结果把!还有栅栏类 CyclicBarrier 类可以实现多线程的等待
    http://blog.csdn.net/huang_xw/article/details/7090152你可以去看看
      

  7.   


    package com.cyclicbarrier;import java.util.ArrayList;
    import java.util.List;
    import java.util.concurrent.BrokenBarrierException;
    import java.util.concurrent.CyclicBarrier;
    /**
     * @author wankun
     * 多线程实现并发数组排序
     */
    public class TestCyclicBarrier implements Runnable{ public static void main(String[] args) {
    sortList();
    } public List list ;
    public int pid;
    public CyclicBarrier barrier;
    public TestCyclicBarrier(List list,int pid,CyclicBarrier barrier) {
    this.list = list;
    this.pid = pid;
    this.barrier = barrier;
    }
    @Override
    public void run() {
    System.out.println("线程"+pid+"开始排序list");
    try {
    dosomething(list);
    } catch (InterruptedException e1) {
    e1.printStackTrace();
    }
    System.out.println("线程"+pid+"排序list结束");
    try {
    barrier.await();
    } catch (InterruptedException e) {
    e.printStackTrace();
    } catch (BrokenBarrierException e) {
    e.printStackTrace();
    }

    }

    public void dosomething(List list) throws InterruptedException
    {
    System.out.println("排序数组");
    Thread.sleep(5000);
    }

    public static void sortList()
    {
    List<Integer> list = new ArrayList<Integer>();
    list.add(8);
    list.add(4);
    list.add(10);

    CyclicBarrier barrier = new CyclicBarrier(2, new Runnable() {
    public void run() {
    System.out.println("两个线程排序List结束,执行其他");
    }
    });

    new Thread(new TestCyclicBarrier(list,0,barrier)).start();
    new Thread(new TestCyclicBarrier(list,1,barrier)).start();
    }
    }