多线程问题

心如刀割 2012-06-04 11:25:12

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分钟完成循环里的操作?
...全文
279 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
心如刀割 2012-06-08
  • 打赏
  • 举报
回复
谢谢大家的分析哦
hnu_0720 2012-06-07
  • 打赏
  • 举报
回复
我觉得4楼的理解有点错误。CPU与多线程是没有关系,但是要提高执行的速度就和多线程有关系了。如果是单CPU ,就算你线程再多,不算线程之间的切换,最快也就线性的速度,一个时间你只能执行一个线程的代码块,如果是多核的,那么可以在同一时间执行多个线程。
coooliang 2012-06-07
  • 打赏
  • 举报
回复
请问你们,那这个需求要怎么写?
shandong_chu 2012-06-05
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 的回复:]

有人做过测试吗?
[/Quote]

ME
flyoversky 2012-06-05
  • 打赏
  • 举报
回复
有人做过测试吗?
lonenomad 2012-06-05
  • 打赏
  • 举报
回复
我认为同意三楼观点的网友,缺少对硬件并行概念的认识。多线程底层肯定是用并行的概念实现的。因而总是站在串行的观点上理解并行。串行就不存在效率的提高多线程也失去意义。
周靖峰 2012-06-04
  • 打赏
  • 举报
回复
把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分钟内干完了
huage 2012-06-04
  • 打赏
  • 举报
回复
当然是可以的撒
但是需要注意的是 十个线程不一定会在一分钟完成以前需要10分钟做的事,这里就需要做一个类似监听的的东西来关注是否真的完成
王二北 2012-06-04
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]
对于单CPU来说,多线程并不能提高执行速度,反而是减慢了。
一个线程执行需要10分钟,十个线程执行肯定比10分钟要慢,因为要做线程同步。
吃一个面包,要10分钟;把这个面包切成十份,一个一个轮流咬一口的吃,一分钟就能吃完吗?肯定不会嘛。
[/Quote]
支持3楼,对于单核在cpu确实如此,单核的cpu是怎么进行多线程的?四楼知道吗?,单核的cpu就是进行多线程之间的切换,这个切换自然也是需要资源在的,所以效率反而会降低。
但如果是多核的cpu,那自然是提高了效率,单核就是一个人做10件事,多核就是多个人做10件事,自然是多核的快了。
LoverForCode 2012-06-04
  • 打赏
  • 举报
回复
如果执行时间确实比较很长,可以考虑用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();
}
}
萧十三少 2012-06-04
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 的回复:]

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


这个我还真不认同。 线程又不是越多越……
[/Quote]线程切换很浪费CPU的性能!
萧十三少 2012-06-04
  • 打赏
  • 举报
回复
执行一个方法要一分钟,但根据CPU的性能比如四线程或更高配置,同时运行10个线程的时间就会大大缩短!
老张-AI 2012-06-04
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]
3楼对多线程的理解也太狭隘了吧。多线程跟CPU的个数没有关系。CPU的调度是由底层实现的。多线程技术主要是增加CPU的占用率。用任务管理器看一下cpu的占用率就会发现,大多数时间cpu的占用率都较低。也就是说CPU闲得很,空闲时间可以做很多事情。比如服务器端的程序肯定是多线程的。不能一个人访问,全家人都等着吧。
[/Quote]

这个我还真不认同。 线程又不是越多越好, 线程切换开销很大的
lonenomad 2012-06-04
  • 打赏
  • 举报
回复
硬件底层是并行的,不要吧CPU理解为一个服务员,要理解为10个。你的一个线程就给你分配一个服务员。3个线程就分配3个。当然可以提高执行速度。只有超过10个时,CPU才可能手忙脚乱。你一个单线程的程序CPU会给你分配10个服务员吗?
  • 打赏
  • 举报
回复
其实还是要看情况的。
“执行一个方法要10分钟”,那么执行过程中是一直占用CPU吗?还是涉及到一些I/O操作呢?
如果是一直占用CPU的话,那么在单CPU的情况下,采用时间片轮转等方法来实现反而会降低效率,因为涉及到一些调度的开销
如果期间有I/O等操作,也就是说着10分钟内CPU有空闲的,那么当然采用多线程调度会降低时间,提高效率。
代码荣耀 2012-06-04
  • 打赏
  • 举报
回复
List是线程不安全的喔!
lonenomad 2012-06-04
  • 打赏
  • 举报
回复
3楼对多线程的理解也太狭隘了吧。多线程跟CPU的个数没有关系。CPU的调度是由底层实现的。多线程技术主要是增加CPU的占用率。用任务管理器看一下cpu的占用率就会发现,大多数时间cpu的占用率都较低。也就是说CPU闲得很,空闲时间可以做很多事情。比如服务器端的程序肯定是多线程的。不能一个人访问,全家人都等着吧。
brightyq 2012-06-04
  • 打赏
  • 举报
回复
对于单CPU来说,多线程并不能提高执行速度,反而是减慢了。
一个线程执行需要10分钟,十个线程执行肯定比10分钟要慢,因为要做线程同步。
吃一个面包,要10分钟;把这个面包切成十份,一个一个轮流咬一口的吃,一分钟就能吃完吗?肯定不会嘛。

62,621

社区成员

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

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