`

java 多个线程执行完后再取得结果

 
阅读更多

以前在网上看到过一个面试题,大意是从: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 两个线程相互顺序输出

    - 在Java中,线程同步是为了避免多个线程对共享资源的不正确访问,防止数据的不一致性。Java提供了多种同步机制,如`synchronized`关键字、`Lock`接口(如`ReentrantLock`)、`Semaphore`信号量、`CyclicBarrier`...

    Java线程 学习

    - **活锁**:两个或多个线程不断重复同样的工作,却无法取得进展的情况。 - **饥饿**:某个线程长期得不到执行机会。 - **竞态条件**:当多个线程访问同一资源并试图更改它时,可能导致不确定的结果。 #### 八、...

    java 猜数字游戏,学习线程

    线程是操作系统分配CPU时间的基本单元,一个进程可以有多个线程,它们共享同一块内存空间,各自执行不同的任务。在Java中,我们可以通过`Thread`类或`Runnable`接口来创建线程。 2. **Java中的线程创建**: - ...

    Java线程与多线程教程Java开发Java经验技巧共4页

    - **线程的定义**:线程是进程中的一个执行单元,每个进程可以包含一个或多个线程。 - **线程状态**:Java中的线程有新建(New)、就绪(Runnable)、运行(Running)、等待(Blocked)、阻塞(Waiting)和终止...

    java线程安全总结.doc

    线程安全是指当多个线程访问同一块代码时,如果每个线程都能得到预期的结果,且不产生数据不一致或同步问题,那么这块代码就被称为线程安全的。Java中的线程安全问题通常表现为竞态条件、死锁、活锁和饥饿现象。 ##...

    java多线程几个概念

    4. **线程安全**:当多个线程访问共享资源时,需要采取措施确保数据的一致性和完整性,这就涉及到线程安全的概念。常见的实现方式有synchronized关键字、volatile关键字以及使用锁等机制。 #### 二、Java中实现多...

    Java分布式应用学习笔记05多线程下的并发同步器

    当多个线程并行执行时,`FutureTask`可以帮助我们收集这些线程的计算结果,并最终整合为一个整体的结果。这对于需要进行并行计算然后合并结果的场景非常有用,例如在科研计算或者大数据处理中经常遇到这样的需求。 ...

    java课程设计 多线程设计 内含源代码 打包发布

    当有多个线程时,它们可能在CPU的不同核上并行运行,也可能由操作系统进行时间片轮转,给人一种并行执行的错觉。理解如何控制线程执行顺序对于优化性能至关重要。 4. **线程同步**: 为避免多线程环境下可能出现...

    Java多线程实例程序

    死锁是指两个或多个线程相互等待对方释放资源导致无法继续执行的情况。活锁则是线程不断尝试但无法取得进展的状态。了解如何避免和处理这些情况对于编写健壮的多线程程序至关重要。 8. **线程优先级** Java线程...

    java面试多线程高并发相关回家技巧(超经典)

    3. **CountDownLatch、CyclicBarrier和Semaphore**:这些都是并发控制工具,用于协调多个线程的执行,如计数器、屏障和信号量。 四、死锁与活锁 1. **死锁**:当两个或更多线程互相等待对方释放资源而无法继续执行...

    一个小小的JAVA多线程程序

    在Java编程语言中,多线程是核心特性之一,它允许程序同时执行多个任务,从而提高了效率和响应性。在“一个小小的JAVA多线程程序”这个项目中,我们看到一个具体的实例,模拟了学校、学生和父母之间关于交费的交互。...

    狂神说多线程详解.rar

    1. 线程:线程是操作系统调度的基本单位,一个进程中可以包含多个线程,它们共享同一内存空间,减少了创建和销毁进程的开销。 2. 主线程:每个进程都至少有一个主线程,它是程序执行的起点。 3. 用户线程和内核线程...

    【面试资料】-(机构内训资料)Java多线程面试59题(含答案)_.zip

    ** 线程是程序执行的最小单位,一个进程可以包含多个线程。 - **线程的状态**:新建、就绪、运行、阻塞、死亡,理解这些状态及其转换。 - **Java中的线程创建方式**:通过实现Runnable接口或者继承Thread类。 2. ...

    Java多线程同步机制在网络售票系统中的应用.pdf

    继承Thread类的方式限制较大,不适合多个线程共享资源;而实现Runnable接口的方式更为灵活,既允许继承其他类,也方便实现资源共享。 多线程机制虽然可以提高程序的执行效率和系统资源利用率,但也存在线程安全问题...

    面向Java多线程机制的软件重构方法.pdf

    2. 同步:控制多个线程对共享资源的访问,避免数据不一致,通常通过`synchronized`关键字实现。 三、线程安全问题 1. 死锁:两个或更多线程相互等待对方释放资源导致无法继续执行。 2. 活锁:线程不断重试但始终...

    基于Java多线程技术实现的粒子群优化算法

    Java的多线程机制允许开发者创建多个线程来执行并发任务,这对于实现高效的异步粒子群优化至关重要。 具体来说,每个粒子的行为被封装在一个单独的线程中。当粒子线程运行时,它会不断地评估自身的位置和速度,并...

    Java多线程编程学习.pdf

    在Java中,每个Java应用程序至少有一个进程,每个进程可以包含多个线程。 1.2 线程的生命周期 Java线程有新建、就绪、运行、阻塞和死亡五个状态。理解这些状态有助于我们更好地控制和管理线程。 二、Java多线程...

    多线程开发书籍

    多线程编程是指在程序中创建多个线程来并发执行任务的一种技术。这种技术能够充分利用现代多核处理器的能力,提高应用程序的运行效率。多线程开发在软件开发中占据着重要的地位,尤其是在服务器端应用、游戏开发、大...

    深入理解-Java-多线程核心知识:跳槽面试必备.docx

    - **死锁**:多个线程互相等待对方持有的资源,形成一个循环等待链,导致所有涉及的线程都无法继续执行的状态。解决死锁的方法包括避免、预防、检测和恢复等策略。 - **活锁**:与死锁类似,但不同的是活锁中线程...

Global site tag (gtag.js) - Google Analytics