以前在网上看到过一个面试题,大意是从:2GB的文件中去把所出现的单词个数统计出来,不用第三方软件,只用java 基础,找了半天,没找到,今天在写程序时,界面上有五个查询,都是不相关查询,我想用这种思想来试试,主要就是fork-join的一种简单实现形式,当然fork-join的思想还有很多,去google吧, 查看java API 可知Thread 中有一个 getState() 方法,这里可以得到线程的运行状态,启动三个线程去查询,如果三个线程都结束了,再把每个线程查询的结果汇总起来,如果数据量少的话,还是不要用,在单线程查询性能不高的情况下可以试试,在此发一个示例如下:
import java.util.ArrayList;
import java.util.List;
/**************************************************************************
* $RCSfile: $ $Revision: $ $Date: $
*
* $Log: $
**************************************************************************/
/*
* Copyright 2008 gxlu, Inc. All rights reserved.
* File name : TesMain.java
* Created on : 2012-9-25 下午2:35:56
* Creator : Administrator
*/
/**
* <pre>
* Description : TODO
* @author Administrator
* </pre>
*/
public class TesMain {
private boolean flag = true ;
private List<Integer> l1 = new ArrayList<Integer>();
private List<Integer> l2 = new ArrayList<Integer>();
private List<Integer> l3 = new ArrayList<Integer>();
private List<Integer> alllist = new ArrayList<Integer>();
private List<Integer> l4 = new ArrayList<Integer>();
public boolean isFlag() {
return flag;
}
public void setFlag(boolean flag) {
this.flag = flag;
}
private TesMain()
{
}
public void test1()
{
R r1 = new R(l1);
Thread t1 = new Thread(r1) ;
R r2 = new R(l2);
Thread t2 = new Thread(r2) ;
R r3 = new R(l3);
Thread t3 = new Thread(r3) ;
t1.start() ;
t2.start() ;
t3.start() ;
while(this.isFlag())
{
if(t1.getState().equals(Thread.State.TERMINATED) &&
t2.getState().equals(Thread.State.TERMINATED) &&
t3.getState().equals(Thread.State.TERMINATED) )
{ // 判断三个线程是否都 结束
// 合并三个结果
for(Integer i : l1)
{
alllist.add(i) ;
}
for(Integer i : l2)
{
alllist.add(i) ;
}
for(Integer i : l3)
{
alllist.add(i) ;
}
// System.out.println("alllist is : " + alllist );
//this.setFlag(false) ; // 当上面三个线程都终止时,才会进入,
// System.out.println("-----");
break ;
}
}
}
private class R implements Runnable
{
private List<Integer> list = null ;
public R(List<Integer> list_)
{
this.list = list_ ;
}
public void run() {
for(int i=0;i<30000;i++)
{
list.add(new Integer(i)) ;
}
}
public List<Integer> getList()
{
return this.list ;
}
}
private class R2 implements Runnable
{
private List<Integer> list = null ;
public R2(List<Integer> list_)
{
this.list = list_ ;
}
public void run() {
for(int i=0;i<90000;i++)
{
list.add(new Integer(i)) ;
}
}
public List<Integer> getList()
{
return this.list ;
}
}
public void test2()
{
R2 r1 = new R2(l4);
Thread t1 = new Thread(r1) ;
t1.start() ;
while(this.isFlag())
{
if(t1.getState().equals(Thread.State.TERMINATED)) // 判断线程是否结束
{
//System.out.println(" l4list is : " + l4 );
this.setFlag(false) ;
}
}
}
/**
* @param args
*/
public static void main(String[] args) {
long c1 = System.currentTimeMillis() ;
TesMain tm = new TesMain();
tm.test1() ; // 三个线程各完成5万条
//tm.test2() ; // 一个线程完成15万条
long c2 = System.currentTimeMillis() - c1 ;
System.out.println(" time is : " + c2/(1000.000) );
}
public void run() {
// TODO Auto-generated method stub
}
}
版权声明:本文为iteye_254原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。