多线程问题 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分钟完成循环里的操作? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 把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分钟内干完了 对于单CPU来说,多线程并不能提高执行速度,反而是减慢了。一个线程执行需要10分钟,十个线程执行肯定比10分钟要慢,因为要做线程同步。吃一个面包,要10分钟;把这个面包切成十份,一个一个轮流咬一口的吃,一分钟就能吃完吗?肯定不会嘛。 3楼对多线程的理解也太狭隘了吧。多线程跟CPU的个数没有关系。CPU的调度是由底层实现的。多线程技术主要是增加CPU的占用率。用任务管理器看一下cpu的占用率就会发现,大多数时间cpu的占用率都较低。也就是说CPU闲得很,空闲时间可以做很多事情。比如服务器端的程序肯定是多线程的。不能一个人访问,全家人都等着吧。 其实还是要看情况的。“执行一个方法要10分钟”,那么执行过程中是一直占用CPU吗?还是涉及到一些I/O操作呢?如果是一直占用CPU的话,那么在单CPU的情况下,采用时间片轮转等方法来实现反而会降低效率,因为涉及到一些调度的开销如果期间有I/O等操作,也就是说着10分钟内CPU有空闲的,那么当然采用多线程调度会降低时间,提高效率。 硬件底层是并行的,不要吧CPU理解为一个服务员,要理解为10个。你的一个线程就给你分配一个服务员。3个线程就分配3个。当然可以提高执行速度。只有超过10个时,CPU才可能手忙脚乱。你一个单线程的程序CPU会给你分配10个服务员吗? 执行一个方法要一分钟,但根据CPU的性能比如四线程或更高配置,同时运行10个线程的时间就会大大缩短! 如果执行时间确实比较很长,可以考虑用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(); }} 支持3楼,对于单核在cpu确实如此,单核的cpu是怎么进行多线程的?四楼知道吗?,单核的cpu就是进行多线程之间的切换,这个切换自然也是需要资源在的,所以效率反而会降低。但如果是多核的cpu,那自然是提高了效率,单核就是一个人做10件事,多核就是多个人做10件事,自然是多核的快了。 我觉得4楼的理解有点错误。CPU与多线程是没有关系,但是要提高执行的速度就和多线程有关系了。如果是单CPU ,就算你线程再多,不算线程之间的切换,最快也就线性的速度,一个时间你只能执行一个线程的代码块,如果是多核的,那么可以在同一时间执行多个线程。 GIS 对算法的要求高吗? io流中文件复制的问题 用JAVA如何实现写CSV文件 编译出错:对于常量池来说,字符串表示的UTF过长,那我想知道,JVM的常量池到底有多大? 不用STOP()方法怎么强制并且较安全的退出僵死的JAVA线程?请大虾们帮帮忙! 请问一个时间处理得类 关于netty4中的AttributeKey 为何java程序里繁体字显示为方块,GB2312的没问题,怎么同时 J2SDK在windows xp中能正常使用吗? jbuilder5的序列号? 100分 关于java调用dll代码的问题, 在线等 数据库查询分页,出现错误,求解,不甚感激
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分钟内干完了
一个线程执行需要10分钟,十个线程执行肯定比10分钟要慢,因为要做线程同步。
吃一个面包,要10分钟;把这个面包切成十份,一个一个轮流咬一口的吃,一分钟就能吃完吗?肯定不会嘛。
“执行一个方法要10分钟”,那么执行过程中是一直占用CPU吗?还是涉及到一些I/O操作呢?
如果是一直占用CPU的话,那么在单CPU的情况下,采用时间片轮转等方法来实现反而会降低效率,因为涉及到一些调度的开销
如果期间有I/O等操作,也就是说着10分钟内CPU有空闲的,那么当然采用多线程调度会降低时间,提高效率。
下面给个简单的代码:
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();
}
}
但如果是多核的cpu,那自然是提高了效率,单核就是一个人做10件事,多核就是多个人做10件事,自然是多核的快了。