java我有一个List想传入多线程的run方法?怎么传?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java我有一个List想传入多线程的run方法?怎么传?相关的知识,希望对你有一定的参考价值。

new thread().start();就运行了 怎么传进去

list里面包含的是多个实体 这个实体都要处理一个方法 那个方法时间耗时长 run方法怎么写可以不用处理完就执行下一个?

假如你的list是在类A中的。而你要出入到的线程为类B,

那么你就在类A那里,定义一个synchronized的方法,getNextElementForList(),里面返回list中的对象。

再 new Thread(new B(this)).start()即可。

补充下,上面的语句在类A中执行,而且类B是实现Runnable接口的。

给你一个类似的类来参考下吧:

import java.io.File;
import java.util.ArrayList;

public class ThreadDemo 

public static void main(String args[])
int threadQuantity=3;
Handle h=new Handle();
h.initList();
h.handle(threadQuantity);


class Handle
private String fileName="C://";
private int next=-1;
private int threadNo=0;
private ArrayList<File> list=new ArrayList<File>();
public Handle(String path)
fileName=path;

public Handle()
public void setPath(String path)
fileName=path;

public void initList()
next=-1;
threadNo=0;
File f=new File(fileName);
list=new ArrayList<File>();
if(f.isDirectory())
File[] fs=f.listFiles();
for(File e:fs)
list.add(e);

else
list.add(f);



public synchronized File getNextFile()
next++;
if(next>=list.size())
threadNo++;
System.out.println(threadNo+"个线程处理完毕");
return null;

return list.get(next);

public void handle(int threadQuantity)
for(int i=0;i<threadQuantity;i++)
new Thread(new ThreadHandle(this)).start();




class ThreadHandle implements Runnable

private Handle handle;
public ThreadHandle(Handle handle)
this.handle=handle;

@Override
public void run() 
// TODO Auto-generated method stub
while(true)
File f=handle.getNextFile();
if(null==f) break;
whatYouDo(f);




private void whatYouDo(File f)
System.out.println("file name is "+f.getName()+" and it is"+(f.isDirectory()?" ":" not ")+"Directory");


参考技术A public class Demo 

public static void main(String[] args) 

List<Object> list = new ArrayList<Object>();
for (Object obj : list) 
new Thread(new A(obj)).start();




class A implements Runnable 

private Object obj;

public A(Object obj) 
this.obj = obj;


@Override
public void run() 
//调用obj的方法

当然,效率非常低。楼主可以传多个对象进去,让一个线程调用多个方法。

多线程速度比较慢,能用单线程就尽量用单线程。

追问

我现在要把数据全部生产excel文件 现在单线程的话一个文件要1秒 要循环生产40多个就很慢了 多线程应该要快些吧!

追答

多线程只是在宏观上同时执行,其实一个cpu每次只能执行一个任务,多任务时cpu就要不停的切换。多线程会让操作系统分给程序更多的时间片来执行代码,线程一多,线程之间的切换也需要时间。造成操作系统整体性能,而你的程序自然执行也慢点。

追问

意思是我现在单线程的话可能要40秒,用了多线程的话可能时间会更多??或者说效率上还是得不到提升?那这个怎么去提升啊 生成excel文件太慢了

追答

数据太多,只能从算法上优化了。要不你换执行速度更高的语言试试。你是用什么框架生成excel文件吧。

追问

jxl 代码不知道咋个优化了 感觉上差不多了 已经 没地方可优化了 分析的那些代码都已经改了很多次了 数据量也不是很大 就是不知道为什么这么慢

追答

文件读写当然很慢啊。上次合并数据库的执行了,执行了将近一个小时。

本回答被提问者采纳
参考技术B 方法有很多种
最简单的就是使用静态变量。
如果线程耗时较长且不用等待线程运行完毕的话,直接另起一个线程就可以了。追问

传值能说具体点嘛?我不是很了解多线程 谢谢。。。

追答

new thread1().run();
new thread2().run();
new thread3().run();
new thread4().run();
new thread....().run();

以上是关于java我有一个List想传入多线程的run方法?怎么传?的主要内容,如果未能解决你的问题,请参考以下文章

201671010138 2016-2017《Java程序设计》

java 多线程-资源共享

《Java多线程编程核心技术》多线程技能

java 方法 传参

JAVA多线程

Java多线程系列-start()和run方法的区别