对于java来说,掌握基本语言已经够呛,在使用到多线程等技术的时候,往往让人望而却步,搞了一个程序,使用多线程,其实程序并不多,但是就是学习多线程的技术就搞了一个晚上,实际上创建多线程以及运用也不是很难,当然我说的是基本应用,如果牵涉到比较深入的部分,那就请自己参考相关技术吧,我把我这程序里使用到的多线程部分给大家8一下。
首先我这个程序是处理一个大的文件,大概200多M,如果单线程的话需要600多秒,四线程的话只需要240秒。我把那一段代码粘贴上解释一下吧。
Thread[] thread=new Thread[threadNum];//创建多线程
for(int i=0;i<threadNum;++i)//分配线程体
{
thread[i]=new SolveWay(i+"");
thread[i].start();//启动进程
}
这个是在主方法里的程序,如果想用几个线程就创建几个线程体,其中SolveWay是主类继承了Thread,当然也可以利用接口实现,SolveWay()里的参数是标示的进程的名字。然后在本类构造函数里用super()对线程名字赋值。
public void run()
{
try {
int num=Integer.parseInt(this.getName());//获取进程的名字
Flow f=new Flow("test_temportary_data"+num+".txt","temportary_data"+num+".arff","?");
f.run();
count++;
if(count==threadCount)
{
maketest(4);
voteresult vr=new voteresult("","test.arff",4);
vr.run();
timeEnd=System.currentTimeMillis();
System.out.println("耗时:"+(timeEnd-timeStart));
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
线程运行的过程就是在run()方法里,当线程start()之后,进程自动调用run()方法执行,这里有一个小问题,就是线程的执行没有先后之别,是并行执行的,你怎么知道所有的线程都执行完了呢,我不知道别人用什么方法,没有仔细查,我使用的一个方法是,定义一个全局变量,用来记录有多少个线程执行完毕,就是上面程序中的count,如果count等于所有的进程数threadCount的话,标示所有的进程全部执行完毕,就可以写后续程序了。注意:后续程序不能写在主方法里调用进程的后边,因为程序在执行的过程中会首先执行main方法也就是主进程,那么子进程还没有执行完毕,主进程和子进程全部都是并行执行的。对于上面的程序只是参考,至于到时候写什么内容,根据自己而定,框架是可以复制,内容完全可以更换。
以上是我对使用多线程的一点小小的心得体会,希望以后对大家有所帮助,如果大家对多线程有更好的看法的话,可以在论坛上发出来,以供参考,如果觉的我的那个地方用得不对的话,也可以提出来,谢谢~ |