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

java 多线程的一个例子二

阅读更多

前文实现的是通过一个主进程进行轮训的方式,这篇文章是采用的是线程自己控制依赖他的线程的新、运行方式。废话不说,贴上代码

xml的解析代码没有改动。主要是贴的是Thread的代码

package com.simple2;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Random;

public class MyThread extends Thread {

	private static Map<MyThread,String> session = new HashMap<MyThread,String>();
	
	//进行lock的Session
	private static String[] lockSession = new String[10];
	
	private int account;
	
	public MyThread(){
		
	}
	
	public int getAfterCount(){
		return this.account;
	}
	
	public void setAfterCount(int count){
		this.account = count;
	}
	
	public void subAfterCount(){
		this.account--;
	}
	
	
	public static void initStaticDomain(){
		produceLockSession();
		initSession();
	}
	//初始化随机数
	private static void initSession(){
		List<ThreadEntity> threadlist = ThreadList.getThreadlist();
		for(int i = 0;i < threadlist.size();i++){
			session.put(threadlist.get(i).getProcess(), lockSession[i]);
		}
	}
	
	private static void produceLockSession(){
		String source = "abcdefghijklmnopqrstuvwxyz";
		String[] lockSession = MyThread.getLockSession();
		Random random = new Random();
		for(int i = 0;i < lockSession.length;i++){
			StringBuilder builder = new StringBuilder();
			//begin to generate a random string which of length is 5
			for(int j = 0;j < 5;j++){
				int position = random.nextInt(source.length());
				builder.append(source.charAt(position));
			}
			String temp = builder.toString();
			//判断生成的string 是否重复
			for(int j = 0;j < lockSession.length;j++){
				String curr = lockSession[i];
				if(curr == null || curr.length() == 0){
					lockSession[i] = temp;
				}else if(curr.equals(temp)){
					//有重复的再次生成;
					i--;
					break;
				}else{
					//不重复,比较下一个
					continue;
				}
			}
		}
	}
	
	public static String[] getLockSession() {
		return lockSession;
	}

	public static void setLockSession(String[] lockSession) {
		MyThread.lockSession = lockSession;
	}

	private void preProcess(){
		if(this.account != 0){
			String lock = session.get(this);
			synchronized (lock) 
			{
				try {
					lock.wait();
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
		}
	}
	//对象进行初始化的时候进行,否则会发生死锁
	public void initAccount() {
		List<ThreadEntity> threadlist = ThreadList.getThreadlist();
		for(ThreadEntity then : threadlist){
			if(then.getProcess() == this){
				//设置account的值
				setAfterCount(then.getPreEntities().size());
				break;
			}
		}
	}

	//运行完毕之后
	private void notifyAfter(){
		List<ThreadEntity> threadlist = ThreadList.getThreadlist();
		for(ThreadEntity te : threadlist){
			//依赖currentThread 的ThreadEntity subAfterCount
			for(Map.Entry<Integer, ThreadEntity> entry:te.getPreEntities().entrySet()){
				
				MyThread thread = entry.getValue().getProcess();
				if(thread == this)
				{
					te.getProcess().subAfterCount();
				}
			}
			//如果te代表的Thread subAfount为零,则开始将该进程的状态由wait变成run
			if(te.getProcess().getAfterCount() == 0)
			{
				String lock = session.get(te.getProcess());
				synchronized (lock) {
					try {
						lock.notify();
					} catch (Exception e) {
						e.printStackTrace();
					}
				}
			}
		}
	}
	
	@Override
	public void run() {
		try {
			//保证我们的所有的线程启动的时间在别的线程完成的时间前
			Thread.sleep(100);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		preProcess();
		
		realRun();
		
		notifyAfter();
	}

	private void realRun() {
		List<ThreadEntity> threadlist = ThreadList.getThreadlist();
		for(ThreadEntity then : threadlist){
			if(then.getProcess() == this)
			{
				System.out.println("current running Thread ID :" + then.getThreadID());
			}
		}
	}
	
}

 Entity的代码没有什么改变,只是参数process改为MyThread

代码如下

package com.simple2;

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

import com.simple2.ThreadEntity;


public class ThreadEntity {

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

	private MyThread process;
	
	private boolean ready = false;

	public ThreadEntity(){
			preEntities = new HashMap<Integer, ThreadEntity>();
		    process = new MyThread();
	}
	
	public Integer getThreadID() {
		return threadID;
	}

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

	public Map<Integer, ThreadEntity> getPreEntities() {
		return preEntities;
	}

	public void setPreEntities(Map<Integer, ThreadEntity> preEntities) {
		this.preEntities = preEntities;
	}

	public MyThread getProcess() {
		return process;
	}

	public void setProcess(MyThread process) {
		this.process = process;
	}

	public boolean isReady() {
		return ready;
	}

	public void setReady(boolean ready) {
		this.ready = ready;
	}
	
	public void addPreEntity(ThreadEntity te) {
		this.preEntities.put(te.getThreadID(), te);
	}
	
}

 由上文我们可以知道,MyThread 创建对象的时候就对static 的对象尽心初始化,会造成初始化的error,这个是因为,MyThread 依赖 Threadlist ,但是Threadlist设置threadlist的时候,正好也是依赖MyThread,我只有先对MyThread进行初始化,然后再设置threadlist。

所以说,MyThread  static 里的成员,最好等threadlist初始化之后,在进行初始化。所以说,他们的生命周期需要向后推迟。还有当我们对account进行初始化的时候,不能在线程启动之后之后进行初始化。但是account又依赖于threadlist,所以说,account 也是不能在对象初始化的时候进行初始化,也是将生命周期延后。所以说,threadlist的代码如下

package com.simple2;

import java.util.List;

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

	private static List<ThreadEntity> threadlist;

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

	public static void setThreadlist(List<ThreadEntity> threadList) {
		threadlist = threadList;
	}
	
	public static void startProcess()
	{
		for(ThreadEntity then:threadlist)
		{
			then.getProcess().initAccount();
			then.getProcess().start();
		}
	}
}

  我用junit测试的时候,犹如,一个test运行完成之后,就认为测试完成,所以别的线程的测试结果总是无法显示,所以使用main进行测试

public static void main(String[] args) throws Throwable {
        ThreadList.setThreadlist(SimpleParse2.parseSimpleXML());
        MyThread.initStaticDomain();
        ThreadList.startProcess();
    }

分享到:
评论

相关推荐

    java多线程的一个简单例子

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

    java一个多线程的经典例子

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

    java多线程例子

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

    java多线程经典例子

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

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

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

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

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

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

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

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

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

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

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

    java多线程经典案例

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

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

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

    java中线程的应用例子

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

    JAVA单线程多线程

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

    java多线程示例

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

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

    总之,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