- 浏览: 80021 次
- 性别:
- 来自: 信阳
最新评论
-
Mr_pop:
jqplot 的一些补充 -
zz_wangyuhoho:
你好,那么我在linux下,把 实际IP地址(10.10.10 ...
EJB(一) -
zkx1217:
请教下,画Pie chart 时,总共有三部分,其中2部分占的 ...
jqplot 的一些补充 -
yexiongMYBH:
您好,我想请问你一下,我如果只单单用jsf.ajax.requ ...
JSF AJAX 的理解 -
ligangbin117:
我觉得还有更简单的方法,这边要求也是显示百分比和数量两个值。可 ...
jqplot 的一些补充
这个 例子是在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 String 的 offset 问题。
2013-04-12 22:12 2403今天写了一段代码,大致如下文所示, Pattern p ... -
scala - turorial RetryTemplate
2013-03-23 23:17 1141在公司里面用java实现了一个RetryTemplate的模板 ... -
Module implement.
2013-03-10 21:36 0public interface Module { ... -
liferay 的介绍
2012-12-09 21:18 1156liferay到底是什么? liferay是一个迅速支持快速开 ... -
学习tomcat源代码
2011-10-06 22:56 1818国庆节一直在屋里闲着没事,看看了中文版的how tomcat ... -
查找Annotation class的遍历
2011-06-10 18:34 1655当我们使用自己定义的annotation,怎么才能获得使用an ... -
<h:dataTable/> <h:commandLink/> 的一种解决方案
2011-05-29 21:11 4032当我们使用<h:dataTable/ ... -
JSF AJAX 的理解
2011-05-22 14:08 8495关于access backing bean的用 ... -
java 多线程的一个例子二
2011-05-17 15:59 1525前文实现的是通过一个主进程进行轮训的方式,这篇文章是采用的是线 ... -
java类的加载顺序
2011-03-26 21:40 5892一个java类的加载顺序,今天做了一个实验,结果如下 ... -
actionListener 和一些ajax的理解
2010-05-19 16:21 1303对于actionListener我理解的就不是太多了 我的角度 ... -
关于代理模式的一些小的例子
2010-05-01 23:27 1078代理的方法是有两种 一种是静态的代理方法 还有一种是动态的代 ... -
EJB(一)
2010-04-05 21:03 1954昨天开始接触的EJB 按照视频上的讲解很快就学会了一个例子he ... -
JavaMail 学习(一)
2010-03-30 18:37 551编了一个教程里面的最简单的例子,但是显示发送成功但是收邮件的时 ... -
总结1
2009-12-13 18:54 658这一段时间本来是说看完jsp了,最后发现jsp里的例子全是 ... -
感想
2009-10-26 18:58 867一直以来我根本就不知道所谓的高手和我们之间的差距,今天算是知道 ...
相关推荐
java 多线程的一个例子java 多线程的一个例子java 多线程的一个例子java 多线程的一个例子
java一个多线程的经典例子java一个多线程的经典例子
学习java多线程的经典例子,让你深刻了解java多线程编程。
很简单的一个java多线程例子,希望多大家有帮助
java多线程的经典例子教程,精心整理的word文档。
java 多线程小例子 很方便 很实用
Java多线程下载的例子.doc Java多线程下载的例子.doc
java多线程编程详解 里面具有详细的沼泽实例。
Java 多线程 订票 示例 线程安全 Demo 例子 经典
一个java多线程的例子.doc 一个java多线程的例子.doc
Java 多线程访问的经典例子,一个个代码 手动敲出,可以加深或理解 多线程访问 线程安全与同步的问题.
个人编写的涉及JAVA多线程的UI例子,可直接运行看结果,也可看代码,注释详细。 (个人编写,问题难免存在,有问题请留言说明啊,共同进步)
一个线程从A表读数据放入队列 N个线程从队列中取出数据,找到其在子表中的数据 对子表中的数据开3种线程:读,发email,标记状态 N个线程对完成的A表数据做最后处理 支持大数据量跑批,就是个例子,本来是公司发送...
java 的小例子。多线程控制按钮移动。
java 多线程例子
这是给开发者提供的一个最基本的java中线程的开发案例,看了就会,学了就懂的,但要注意线程使用的一些问题,很多网站都有,要细细看。
关于java.util.concurrent多线程核心包内各种线程资源的使用场景例子
6个非常经典的java多线程实例!欢迎下载!!!
java多线程同步互斥访问实例,对于初学者或是温故而知新的同道中人都是一个很好的学习资料
描述java多线程的例子,可供进一步学习多线程的人参考