以前在网上看到过一个面试题,大意是从: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
}
}
分享到:
相关推荐
在一个Java程序内启动多条线程;练习;使用Runnable接口创建线程时指定和取得线程名称;The Thread Class ;继承Thread类创建线程类;继承Thread类创建线程类;在一个Java程序内启动多条线程;继承Thread类时设置线程的名字...
通过本源码可以了解到Java如何产生单钥加密的密钥(myKey)、产生双钥的密钥对(keyPair)、如何保存公钥的字节数组、保存私钥到文件privateKey.dat、如何用Java对象序列化保存私钥,通常应对私钥加密后再保存、如何从...
通过本源码可以了解到Java如何产生单钥加密的密钥(myKey)、产生双钥的密钥对(keyPair)、如何保存公钥的字节数组、保存私钥到文件privateKey.dat、如何用Java对象序列化保存私钥,通常应对私钥加密后再保存、如何从...
通过本源码可以了解到Java如何产生单钥加密的密钥(myKey)、产生双钥的密钥对(keyPair)、如何保存公钥的字节数组、保存私钥到文件privateKey.dat、如何用Java对象序列化保存私钥,通常应对私钥加密后再保存、如何从...
通过本源码可以了解到Java如何产生单钥加密的密钥(myKey)、产生双钥的密钥对(keyPair)、如何保存公钥的字节数组、保存私钥到文件privateKey.dat、如何用Java对象序列化保存私钥,通常应对私钥加密后再保存、如何从...
通过本源码可以了解到Java如何产生单钥加密的密钥(myKey)、产生双钥的密钥对(keyPair)、如何保存公钥的字节数组、保存私钥到文件privateKey.dat、如何用Java对象序列化保存私钥,通常应对私钥加密后再保存、如何从...
通过本源码可以了解到Java如何产生单钥加密的密钥(myKey)、产生双钥的密钥对(keyPair)、如何保存公钥的字节数组、保存私钥到文件privateKey.dat、如何用Java对象序列化保存私钥,通常应对私钥加密后再保存、如何从...
通过本源码可以了解到Java如何产生单钥加密的密钥(myKey)、产生双钥的密钥对(keyPair)、如何保存公钥的字节数组、保存私钥到文件privateKey.dat、如何用Java对象序列化保存私钥,通常应对私钥加密后再保存、如何从...
谈谈java多线程 23.谈谈文件加密技术 24.软件开发生命周期 25.路由协议种类及特点 26.java的awt和swing组件的GUI设计的关键 27.对于java流的认识 28.简单描述一下awt与swing区别。 29.简述java编程中事件处理...
当一个对象 P1 在不同的线程中执行这个同步方法时,它们之间会形成互斥,达到同步的效果。但是,这个对象所属的 Class 所产生的另一对象 P2 却可以任意调用这个被加了 synchronized 关键字的方法。 在以下代码中: ...
通过本源码可以了解到Java如何产生单钥加密的密钥(myKey)、产生双钥的密钥对(keyPair)、如何保存公钥的字节数组、保存私钥到文件privateKey.dat、如何用Java对象序列化保存私钥,通常应对私钥加密后再保存、如何从...
72、当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法? 18 73、线程的基本概念、线程的基本状态以及状态之间的关系 18 74、sleep() 和 wait() 有什么区别? 18 75、socket通信...
答:Servlet与CGI的区别在于Servlet处于服务器进程中,它通过多线程方式允许其service方法,一个实例可以服务于多个请求,并且其实例一般不会被销毁,而CGI对每个请求都产生新的进程,服务完后就销毁,所以效率上...
本文档提供了 Java 面试题大全,涵盖了 Java 基础知识、JSP&Servlet 技术、J2EE 相关知识、其他相关知识等多个方面。通过本文档,读者可以了解 Java 的基础知识、Web 开发技术、企业级应用开发等多个方面的知识点。 ...
<br>(14) 第14章:多线程 Java提供了一套内建的机制,可提供对多个并发子任务的支持,我们称其为“线程”。这线程均在单一的程序内运行。除非机器安装了多个处理器,否则这就是多个子任务的唯一运行方式。...
53. 一个".java"源文件中是否可以包括多个类(不是内部类)?有什么限制? 13 54. java中有几种方法可以实现一个线程?用什么关键字修饰同步方法? stop()和suspend()方法为何不推荐使用? 13 55. java中有几种类型的流?...
当多个线程执行临界区的结果可能因线程执行的顺序而异时,则称临界区包含竞争条件。 术语竞态条件源于线程正在通过临界区竞争的比喻,并且该竞争的结果影响执行临界区的结果。 活力 并发应用程序及时执行的能力被...
微信方法是由Servlet在获取请求消息或事件的策略后取得,Servlet取得微信方法后,在线程池中获取线程执行微信方法。缺省线程池的大小是10个,如果微信公众并发比较频繁,我们可以调整线程池的大小,以提高处理效率。...