`
暗夜骑士0376
  • 浏览: 81319 次
  • 性别: Icon_minigender_1
  • 来自: 信阳
社区版块
存档分类
最新评论

java 多线程的一个例子

阅读更多

这个 例子是在IBM的一个文章中找到的,http://www.ibm.com/developerworks/cn/java/j-lo-concurrent-frmk/index.html

我只是作出了自己的实现,虽然比不上别人,但是也算是学习了

先贴代码:

<?xml version="1.0" encoding="UTF-8"?>
<threadlist>
	<thread-ins thread-id="1"/>
	<thread-ins thread-id="2">
		<pre-threadID>1</pre-threadID>
	</thread-ins>
	<thread-ins thread-id="3">
		<pre-threadID>2</pre-threadID>
	</thread-ins>
	<thread-ins thread-id="4">
		<pre-threadID>2</pre-threadID>
		<pre-threadID>3</pre-threadID>
	</thread-ins>
	<thread-ins thread-id="5">
		<pre-threadID>3</pre-threadID>
	</thread-ins>
	<thread-ins thread-id="6">
		<pre-threadID>4</pre-threadID>
		<pre-threadID>5</pre-threadID>
	</thread-ins>
	<thread-ins thread-id="7">
		<pre-threadID>6</pre-threadID>
	</thread-ins>
</threadlist>

 这个是xml的格式,这个xml表示了线程之间的依赖关系

我的结构上是ThreadEntity

代码如下

package com.simple;

import java.util.HashMap;
import java.util.Map;

public class ThreadEntity {

	private Integer threadID;
	
	private Map<Integer,ThreadEntity> preEntities;

	private Thread process;
	
	private boolean ready = false;
	
	public ThreadEntity(){
		preEntities = new HashMap<Integer, ThreadEntity>();
		process = new Thread(new Runnable() {
			@Override
			public void run() {
				System.out.println("this ThreadEntity ID:" + ThreadEntity.this.threadID);
			}
		});
	}
	
	public void runProcess(){
		
		if(process.getState() == Thread.State.NEW){
			process.start();
		}
	}
	
	public Integer getThreadID() {
		return threadID;
	}

	public void setThreadID(Integer threadID) {
		this.threadID = threadID;
	}

	public Map<Integer, ThreadEntity> getPreEntities() {
		return preEntities;
	}
	
	public void addPreEntity(ThreadEntity te){
		this.preEntities.put(te.getThreadID(), te);
	}
	
	public boolean isReady(){
		return this.ready;
	}
	public void setReady(boolean Flag){
		this.ready = Flag;
	}
	public Thread.State getState(){
		return process.getState();
	}
}

 下面是一个list存放ThreadEntity

package com.simple;

import java.util.List;

/**
 * 描述:
 * @author tippy
 * @date 2011-5-15
 */
public class ThreadList {

	private List<ThreadEntity> threadlist;

	public List<ThreadEntity> getThreadlist() {
		return threadlist;
	}

	public void setThreadlist(List<ThreadEntity> threadlist) {
		this.threadlist = threadlist;
	}
	
	
}

 最后是解析xml的代码,对了解使用java自带的dom解析xml的可以不看

 

package com.support;

import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

import com.simple.ThreadEntity;

//用Java自带的xml parser进行解析xml文档
public class SimpleParse {

	
	
	public SimpleParse(){
	}
	//算法采用的是,如果这个element有pre-thread 那么就递归,解析pre-thread 对应的threadins
	public static List<ThreadEntity> parseSimpleXML(){
		DocumentBuilderFactory domfac = DocumentBuilderFactory.newInstance();
		InputStream is = null;
		//store the ThreadEntity
		List<ThreadEntity> threadList = new ArrayList<ThreadEntity>();
		try{
			DocumentBuilder dombuilder = domfac.newDocumentBuilder();
			is = Thread.currentThread().getContextClassLoader().getResourceAsStream("simple.xml");
			
			Document doc = dombuilder.parse(is);
			Element rootElt = doc.getDocumentElement();
			//get threadins nodes
			NodeList threadNodes = rootElt.getChildNodes();
			//store the node which has been acess
			Map<Node,ThreadEntity> threadMap = new HashMap<Node,ThreadEntity>();
			
			if(threadNodes != null)
			{
				//iterator the threadins
				for(int i = 0;i < threadNodes.getLength();i++){
					Node threadins = threadNodes.item(i);
					if(threadins.getNodeType() == Node.ELEMENT_NODE){
						threadList.add(parseSimpleNode(threadins, threadMap, threadNodes));
					}	
				}
			}
		}catch(Exception e){
			e.printStackTrace();
		}finally{
			if(is != null){
				try {
					is.close();
				} catch (IOException e) {
					System.out.println("close is 失败");
				}
			}
		}
		return threadList;
	}
	
	static ThreadEntity  parseSimpleNode(Node currNode,Map<Node,ThreadEntity> historyNodes,NodeList threadNodes){
		
		ThreadEntity currEntity = historyNodes.get(currNode);
		//is not exist these nodes
		if(currEntity == null){
			//create a new Instance
			currEntity = new ThreadEntity();
			//set this entity id
			currEntity.setThreadID(Integer.parseInt(currNode.getAttributes().getNamedItem("thread-id").getNodeValue()));
			//get the pre-threadID Nodes
			NodeList preNodes = currNode.getChildNodes();
			if(preNodes != null && preNodes.getLength() != 0){
				for(int i = 0;i<preNodes.getLength();i++){
					//get current preNode child
					Node preNode = preNodes.item(i);
					//if exit child element pre-threadID 
					if(preNode.getNodeType() == Node.ELEMENT_NODE){
						currEntity.setReady(false);
						Node threadNode = checkNode(preNode.getTextContent(),threadNodes);
						ThreadEntity preEntity = parseSimpleNode(threadNode, historyNodes, threadNodes);
						currEntity.addPreEntity(preEntity);
					}
				}
			}
			//put this entity to history
			historyNodes.put(currNode, currEntity);
		}
		return currEntity;
	}

	/**
	 *描述:
	 *2011-5-15
	 */
	private static Node checkNode(String  attrValue, NodeList threadNodes) {
		Node wishNode = null;

		for(int i = 0;i<threadNodes.getLength();i++){
			Node currNode = threadNodes.item(i);
			if(currNode != null &&currNode.getNodeType() == Node.ELEMENT_NODE && currNode.getAttributes().getNamedItem("thread-id").getNodeValue().equals(attrValue)){
				wishNode = currNode;
				break;
			}
		}
		if(wishNode == null){
			throw new RuntimeException();
		}

		return wishNode;
	}
}

  测试代码

package com.simple.test;


import java.lang.Thread.State;
import java.util.Map;

import org.junit.BeforeClass;
import org.junit.Test;

import com.simple.ThreadEntity;
import com.simple.ThreadList;
import com.support.SimpleParse;

public class SimpleThreadCase {

	@BeforeClass
	public static void setUpBeforeClass() throws Exception {
	}
	//测试解析结果的代码
	@Test
	public void testParseSimpleXML(){
		ThreadList threadlist = new ThreadList();
		threadlist.setThreadlist(SimpleParse.parseSimpleXML());
		StringBuilder builder = new StringBuilder();
		builder.append("<threadlist>\r\n");
		for(ThreadEntity te : threadlist.getThreadlist()){
			builder.append("\t<threadins thread-id=\""+te.getThreadID()+"\">\r\n");
			for(Map.Entry<Integer, ThreadEntity> entity : te.getPreEntities().entrySet()){
				builder.append("\t\t<pre-threadID>" + entity.getKey() + "</pre-threadID>\r\n");
			}
			builder.append("\t</threadins>\r\n");
		}
		builder.append("</threadlist>");
		System.out.println(builder.toString());
	}
	//测试运行7线程的结果显示
	@Test
	public void testThreadCase(){
		ThreadList threadlist = new ThreadList();
		threadlist.setThreadlist(SimpleParse.parseSimpleXML());
		
		ThreadEntity target = getByID(threadlist, 7);
		runThread(target);
		
	}
	//运行7的算法
	private void runThread(ThreadEntity te){
		
		//如果没有准备好,先run pre的线程
		while(!te.isReady())
		{
			boolean Flag = true;
			for(Map.Entry<Integer, ThreadEntity> entry:te.getPreEntities().entrySet()){
				ThreadEntity preEntity = entry.getValue();
				Flag = preEntity.getState()==State.TERMINATED? (Flag && true):false;
				runThread(preEntity);
			}
			if(Flag){//preThread已经运行完毕
				te.setReady(true);
			}
		}
		te.runProcess();
	}
	
	private ThreadEntity getByID(ThreadList threadlist,int id){
		
		ThreadEntity entity = null;
		
		for(ThreadEntity aentity : threadlist.getThreadlist()){
			if(aentity.getThreadID() == id){
				entity = aentity;
				break;
			}
		}
		if(entity == null){
			throw new RuntimeException("can not found the EntityID" + id + ",in the threadList");
		}
		return entity;
	}
}

  运行结果,testThreadCase 的结果

this ThreadEntity ID:1
this ThreadEntity ID:2
this ThreadEntity ID:3
this ThreadEntity ID:4
this ThreadEntity ID:5
this ThreadEntity ID:6
this ThreadEntity ID:7
 

 

分享到:
评论

相关推荐

    java多线程的一个简单例子

    很简单的一个java多线程例子,希望多大家有帮助

    java多线程例子

    Java 多线程例子 Java 多线程是 Java 编程语言中的一种基本概念,它允许程序同时执行多个任务,从而提高程序的性能和效率。本文将通过三个实用的例子,讲解 Java 多线程的基本概念和使用方法。 第一个例子:创建多...

    java一个多线程的经典例子

    根据提供的文件信息,我们可以归纳出以下关于Java多线程的经典示例中的关键知识点: ### Java多线程实现方式 在Java中,实现多线程有两种主要的方法:通过继承`Thread`类或者实现`Runnable`接口。 #### 继承...

    java多线程经典例子

    在Java多线程编程中,理解如何创建和...总的来说,这个例子展示了Java多线程的基本操作,包括创建、启动、管理和通信。理解和掌握这些概念对于进行并发编程是至关重要的,可以帮助开发者构建高效、稳定的多线程应用。

    java 多线程小例子 很方便 很实用 适合初学者

    在给定的代码示例中,我们首先看到的是一个简单的Java多线程应用实例。这个例子展示了如何创建并启动一个新的线程。在`ThreadDemo`类的`main`方法中,我们创建了一个名为`TestThread`的新线程,并调用了它的`start()...

    JAVA多线程的一个带UI界面的例子

    在Java编程中,多线程是一项关键特性,...总之,这个"JAVA多线程的一个带UI界面的例子"涵盖了Java多线程编程和GUI设计的核心概念,通过实际的代码示例,有助于开发者深入理解如何在实际应用中正确、高效地使用多线程。

    Java多线程的小例子——吃包子

    这个名为"Java多线程的小例子——吃包子"的示例,旨在帮助开发者直观地理解多线程的工作原理。下面我们将深入探讨该示例所涉及的核心知识点。 首先,多线程通常涉及到以下几个关键概念: 1. **线程(Thread)**:...

    java多线程经典案例

    Java多线程是Java编程中的重要概念,它允许程序同时执行多个任务,极大地提升了程序的效率和性能。在Java中,实现多线程有两种主要方式:通过实现Runnable接口或者继承Thread类。本案例将深入探讨Java多线程中的关键...

    java 多线程的一个例子java 多线程的一个例子

    Java多线程是Java编程中一个重要的概念,它允许程序同时执行多个任务,提高了程序的效率和响应速度。在Java中,可以通过继承`Thread`类或实现`Runnable`接口来创建多线程。在这个例子中,我们将探讨如何通过自定义...

    java多线程编程-详细炒作例子

    ### Java多线程编程详解与实战案例 #### 理解多线程概念与Java内存模型 多线程,作为现代编程中的一项关键技术,允许在单一应用程序中并发执行多个指令流,每个这样的指令流被称为一个线程。在Java中,线程被视为...

    java 多线程 控制按钮移动 例子

    总的来说,Java多线程提供了丰富的功能,包括线程的创建、启动、中断、同步以及异常处理等。通过合理利用这些工具,开发者可以构建出高效、稳定且响应迅速的多线程应用程序。在实际编程中,要特别注意线程安全和性能...

    java中线程的应用例子

    5. **线程优先级**:每个线程都有一个优先级,Java中从1(`MIN_PRIORITY`)到10(`MAX_PRIORITY`),默认优先级是5(`NORM_PRIORITY`)。但优先级并不保证线程的执行顺序,它只是影响调度策略。 6. **线程池**:`...

    JAVA单线程多线程

    ### JAVA中的单线程与多线程概念解析 #### 单线程的理解 在Java编程环境中,单线程指的是程序执行过程中只有一个线程在运行。这意味着任何时刻只能执行一个任务,上一个任务完成后才会进行下一个任务。单线程模型...

    Java多线程实现异步调用实例

    总之,Java多线程和异步调用是构建高效、响应迅速的应用程序的关键技术。通过合理利用这些工具和机制,开发者可以编写出能够充分利用多核处理器优势的代码,从而提高软件性能。在实际应用中,理解并熟练掌握这些概念...

    java多线程示例

    在Java编程语言中,多线程是核心特性之一,它允许程序同时执行多个任务,从而提高了应用程序的效率和响应...文档“java多线程实例.docx”可能包含具体的示例代码和详细解释,建议参考学习,以加深对Java多线程的理解。

    Java 多线程访问的经典例子.txt

    Java 多线程访问的经典例子,一个个代码 手动敲出,可以加深或理解 多线程访问 线程安全与同步的问题.

    Java多线程调用BlockingDeque跑批量数据的例子

    一个线程从A表读数据放入队列 N个线程从队列中取出数据,找到其在子表中的数据 对子表中的数据开3种线程:读,发email,标记状态 N个线程对完成的A表数据做最后处理 支持大数据量跑批,就是个例子,本来是公司发送...

    Java 多线程 订票 示例 线程安全

    现在,让我们来看一个简单的订票系统的Java多线程示例。假设我们有一个票务系统,其中的`TicketService`类包含一个`tickets`变量表示剩余票数: ```java public class TicketService { private int tickets = 100;...

    Java多线程实例代码

    Java多线程是Java编程中的重要概念,它允许程序同时执行多个任务,提高了程序的效率和响应性。在Java中,实现多线程有两种主要方式:通过继承`Thread`类和实现`Runnable`接口。 1. 继承Thread类: 当你需要创建一...

    java多线程并发编程例子

    Java多线程并发编程是Java开发中的重要领域,特别是在服务器端和高并发应用中不可或缺。`java.util.concurrent`包提供了丰富的工具类,帮助开发者更好地管理线程和优化并发性能。以下将详细介绍标题和描述中涉及的...

Global site tag (gtag.js) - Google Analytics