JAVA多线程,求教可行性.

时间:2021-11-13 16:54:44
我有一个循环操作 很慢, 如下

for i= 1 : 512
  for j = 1: 512
  
     大计算量操作.  
  end
end


每次循环的大计算量操作. 写操作没有相互的效果  也就是说 i=1 j=1 和 i=1 j=2 可以同时操作 不影响结果...希望我表达清楚了.

但是有同时的读操作..也就是说要经常读一个内容(数组).需要经常调用同一个对象读.

这样搞成多线程可行么/? 大概怎么拆分合适?
希望给指点指点!多谢!

26 个解决方案

#1


for i= 1 : 512
  for j = 1: 512
    new YourThread(j).execute();
  end;
end;

你这种用多线程性能可以能不会有多少提高。还是优先优化自己的代码吧

#2


引用 1 楼 blazingfire 的回复:
for i= 1 : 512
  for j = 1: 512
    new YourThread(j).execute();
  end;
end;

你这种用多线程性能可以能不会有多少提高。还是优先优化自己的代码吧


这样她就自动多线程来跑了??

#3


不理解楼主的意思
写操作和读操作的输出是什么?在大计算量操作中,到底做了些什么?

#4


引用 3 楼 grubby4k 的回复:
不理解楼主的意思
写操作和读操作的输出是什么?在大计算量操作中,到底做了些什么?


里面是复杂的数学公式的实现..计算量很大.
读写都是针对数组

#5


该回复于2010-12-02 11:21:44被版主删除

#6


不理解楼主的意思

#7


我觉得楼主有必要把线程的概念好好理解一下,因为我觉得好像你的功能里没必要用线程,还有就是把你的需求说的再详细一些。

#8


关注中。。。

#9


如果写操作没有像互相影响,只是读同一个数组(估计i,j就是数组元素的位置),那么可以不用锁数组对象,性能相对有所提高。
for i= 1 : 512
  for j = 1: 512
  new YourThread(i, j, [yourShareObject]).start();
  end;
end;

#10


不理解楼主的意思。

#11


建议用线程池来做,自己new thread,因为线程过多,耗资源

#12


可以试一试,按楼主说的,你的每轮循环对数组的读,其实也不互斥,用多线程或许可以有点用。不过多线程的创建销毁切换也存在开销,可以试试。
每日回帖可以获得10分可用分~

#13


如果只是单纯的数学计算,多线程有可能反而降低运行效率。
不过你可以试一试。
在多线程下,只涉及读的操作的话,效率很高。

#14


引用 4 楼 manutdsodagreen 的回复:
引用 3 楼 grubby4k 的回复:

不理解楼主的意思
写操作和读操作的输出是什么?在大计算量操作中,到底做了些什么?


里面是复杂的数学公式的实现..计算量很大.
读写都是针对数组


只是针对某一数组的操作,觉得不需要用多线程啊。多线程往往是针对多事件的处理。照你的意思,如果只是做数学计算的话,一次循环做一个计算效率肯定比多线程来得高。
如果你部署的环境是多CPU的话可以考虑加几个线程。多线程能提高效率的话主要是针对能并发的事件,你现在的瓶颈应该是在CPU的时间片分配上。

#15


进行运算使用多线程操作没多大用处的,甚至效率更低下。
我觉得你应该从你程序方面入手进行优化,如:考虑使用一些合理的算法。

#16


引用 11 楼 qybao 的回复:
建议用线程池来做,自己new thread,因为线程过多,耗资源

比较赞同这个,线程太多反而影响性能。

#17



public class Test
{
public static void main(String[] args)
{
for (int i = 0; i < args.length; i++)
{
for (int k = 0; k < args.length; k++)
{
new MyThread(i,k).start();
}
}
}

}

class MyThread extends Thread{
private int i;
private int k;
public MyThread(int i,int k){
this.i = i;
this.k = k;
}

@Override
public void run()
{
// My example
System.out.println(i+k);
}
}


#18


引用 11 楼 qybao 的回复:
建议用线程池来做,自己new thread,因为线程过多,耗资源


线程池最好  呵呵

#19


将计算任务分成等分,使用 java.util.concurrent.CountDownLatch 进行阻塞,直到所有的任务全部完成 CountDownLatch 就可以释放,合并计算结果。

#20


不理解楼主的意思。 
 

#21


楼主 建议你去javaeye去看一下吧 在上面搜索 总之 好几个网站一起用会对你有帮助的

#22


看机器的cpu是几核的,如果线程数超过核数,性能其实是下降的。每个核分配一个线程,才能最大程度的利用cpu

也就是说,如果你的程序在单核电脑上跑,不要用多线程。如果在双核上跑,就用双线程

#23


引用 19 楼 bao110908 的回复:
将计算任务分成等分,使用 java.util.concurrent.CountDownLatch 进行阻塞,直到所有的任务全部完成 CountDownLatch 就可以释放,合并计算结果。

还是火龙果的想法有效率,但是分的等分不宜过多

#24


学习
JAVA多线程,求教可行性.

#25


引用 1 楼 blazingfire 的回复:
for i= 1 : 512
  for j = 1: 512
  new YourThread(j).execute();
  end;
end;

你这种用多线程性能可以能不会有多少提高。还是优先优化自己的代码吧

学习

#26


不明白问题

#1


for i= 1 : 512
  for j = 1: 512
    new YourThread(j).execute();
  end;
end;

你这种用多线程性能可以能不会有多少提高。还是优先优化自己的代码吧

#2


引用 1 楼 blazingfire 的回复:
for i= 1 : 512
  for j = 1: 512
    new YourThread(j).execute();
  end;
end;

你这种用多线程性能可以能不会有多少提高。还是优先优化自己的代码吧


这样她就自动多线程来跑了??

#3


不理解楼主的意思
写操作和读操作的输出是什么?在大计算量操作中,到底做了些什么?

#4


引用 3 楼 grubby4k 的回复:
不理解楼主的意思
写操作和读操作的输出是什么?在大计算量操作中,到底做了些什么?


里面是复杂的数学公式的实现..计算量很大.
读写都是针对数组

#5


该回复于2010-12-02 11:21:44被版主删除

#6


不理解楼主的意思

#7


我觉得楼主有必要把线程的概念好好理解一下,因为我觉得好像你的功能里没必要用线程,还有就是把你的需求说的再详细一些。

#8


关注中。。。

#9


如果写操作没有像互相影响,只是读同一个数组(估计i,j就是数组元素的位置),那么可以不用锁数组对象,性能相对有所提高。
for i= 1 : 512
  for j = 1: 512
  new YourThread(i, j, [yourShareObject]).start();
  end;
end;

#10


不理解楼主的意思。

#11


建议用线程池来做,自己new thread,因为线程过多,耗资源

#12


可以试一试,按楼主说的,你的每轮循环对数组的读,其实也不互斥,用多线程或许可以有点用。不过多线程的创建销毁切换也存在开销,可以试试。
每日回帖可以获得10分可用分~

#13


如果只是单纯的数学计算,多线程有可能反而降低运行效率。
不过你可以试一试。
在多线程下,只涉及读的操作的话,效率很高。

#14


引用 4 楼 manutdsodagreen 的回复:
引用 3 楼 grubby4k 的回复:

不理解楼主的意思
写操作和读操作的输出是什么?在大计算量操作中,到底做了些什么?


里面是复杂的数学公式的实现..计算量很大.
读写都是针对数组


只是针对某一数组的操作,觉得不需要用多线程啊。多线程往往是针对多事件的处理。照你的意思,如果只是做数学计算的话,一次循环做一个计算效率肯定比多线程来得高。
如果你部署的环境是多CPU的话可以考虑加几个线程。多线程能提高效率的话主要是针对能并发的事件,你现在的瓶颈应该是在CPU的时间片分配上。

#15


进行运算使用多线程操作没多大用处的,甚至效率更低下。
我觉得你应该从你程序方面入手进行优化,如:考虑使用一些合理的算法。

#16


引用 11 楼 qybao 的回复:
建议用线程池来做,自己new thread,因为线程过多,耗资源

比较赞同这个,线程太多反而影响性能。

#17



public class Test
{
public static void main(String[] args)
{
for (int i = 0; i < args.length; i++)
{
for (int k = 0; k < args.length; k++)
{
new MyThread(i,k).start();
}
}
}

}

class MyThread extends Thread{
private int i;
private int k;
public MyThread(int i,int k){
this.i = i;
this.k = k;
}

@Override
public void run()
{
// My example
System.out.println(i+k);
}
}


#18


引用 11 楼 qybao 的回复:
建议用线程池来做,自己new thread,因为线程过多,耗资源


线程池最好  呵呵

#19


将计算任务分成等分,使用 java.util.concurrent.CountDownLatch 进行阻塞,直到所有的任务全部完成 CountDownLatch 就可以释放,合并计算结果。

#20


不理解楼主的意思。 
 

#21


楼主 建议你去javaeye去看一下吧 在上面搜索 总之 好几个网站一起用会对你有帮助的

#22


看机器的cpu是几核的,如果线程数超过核数,性能其实是下降的。每个核分配一个线程,才能最大程度的利用cpu

也就是说,如果你的程序在单核电脑上跑,不要用多线程。如果在双核上跑,就用双线程

#23


引用 19 楼 bao110908 的回复:
将计算任务分成等分,使用 java.util.concurrent.CountDownLatch 进行阻塞,直到所有的任务全部完成 CountDownLatch 就可以释放,合并计算结果。

还是火龙果的想法有效率,但是分的等分不宜过多

#24


学习
JAVA多线程,求教可行性.

#25


引用 1 楼 blazingfire 的回复:
for i= 1 : 512
  for j = 1: 512
  new YourThread(j).execute();
  end;
end;

你这种用多线程性能可以能不会有多少提高。还是优先优化自己的代码吧

学习

#26


不明白问题