线程问题

心如刀割 2012-05-14 06:27:58

//开始
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都执行完再执行下一次循环码?
...全文
161 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
wankunde 2012-05-16
  • 打赏
  • 举报
回复

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();
}
}
wankunde 2012-05-16
  • 打赏
  • 举报
回复
使用FutureTask处理多线程的返回结果把!

还有栅栏类 CyclicBarrier 类可以实现多线程的等待
http://blog.csdn.net/huang_xw/article/details/7090152

你可以去看看
古布 2012-05-16
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]
Java code

final List<FndMenuEntriesIntDto> sortList = fndMenuEntriesIntDao.getListByMenuId(fList.get(i).getMenuId(), versionId);

Thread th1 = new Thread(new Runnable() {
……
[/Quote]
忘了说一点,主线程,子线程都在运行。但是,如果主线程先运行完后,不会立即结束。会等子线程
lliiqiang 2012-05-16
  • 打赏
  • 举报
回复
不是啊,循环本身也是一种操作
turnaround02 2012-05-15
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]

Java code

final List<FndMenuEntriesIntDto> sortList = fndMenuEntriesIntDao.getListByMenuId(fList.get(i).getMenuId(), versionId);

Thread th1 = new Thread(new Runnable() {
……
[/Quote]

如果这样做,跟不开线程效果相差不大吧?线程1执行完再执行线程2,再进行下一个循环。
qq125759748 2012-05-15
  • 打赏
  • 举报
回复
不会的,就例如好几个人同时做动作。
心如刀割 2012-05-15
  • 打赏
  • 举报
回复

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();
}

这样的话就可以了吗?
古布 2012-05-14
  • 打赏
  • 举报
回复
循环处就是主线程。要想等子线程结束,得调用子线程的join()方法
liuwons 2012-05-14
  • 打赏
  • 举报
回复
线程启动就表示.start()函数执行完了,而不必等到线程中的指令执行完。。。
nmyangym 2012-05-14
  • 打赏
  • 举报
回复
不会等,线程启动完后,当前循环结束,进入下一次循环.又去启动新的线程。每个线程的 doSomeThing1();和doSomeThing2() 什么时候运行,要靠jvm调度了。
德薄才浅 2012-05-14
  • 打赏
  • 举报
回复
当然不会,若会的何必用另起线程
tangwei070 2012-05-14
  • 打赏
  • 举报
回复
不会等。 可以用log打印看看。当然要数据多一点。

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧