前文实现的是通过一个主进程进行轮训的方式,这篇文章是采用的是线程自己控制依赖他的线程的新、运行方式。废话不说,贴上代码
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中,实现多线程有两种主要的方法:通过继承`Thread`类或者实现`Runnable`接口。 #### 继承...
Java 多线程例子 Java 多线程是 Java 编程语言中的一种基本概念,它允许程序同时执行多个任务,从而提高程序的性能和效率。本文将通过三个实用的例子,讲解 Java 多线程的基本概念和使用方法。 第一个例子:创建多...
在Java多线程编程中,理解如何创建和...总的来说,这个例子展示了Java多线程的基本操作,包括创建、启动、管理和通信。理解和掌握这些概念对于进行并发编程是至关重要的,可以帮助开发者构建高效、稳定的多线程应用。
在给定的代码示例中,我们首先看到的是一个简单的Java多线程应用实例。这个例子展示了如何创建并启动一个新的线程。在`ThreadDemo`类的`main`方法中,我们创建了一个名为`TestThread`的新线程,并调用了它的`start()...
在Java编程中,多线程是一项关键特性,...总之,这个"JAVA多线程的一个带UI界面的例子"涵盖了Java多线程编程和GUI设计的核心概念,通过实际的代码示例,有助于开发者深入理解如何在实际应用中正确、高效地使用多线程。
### Java多线程编程详解与实战案例 #### 理解多线程概念与Java内存模型 多线程,作为现代编程中的一项关键技术,允许在单一应用程序中并发执行多个指令流,每个这样的指令流被称为一个线程。在Java中,线程被视为...
Java多线程是Java编程中一个重要的概念,它允许程序同时执行多个任务,提高了程序的效率和响应速度。在Java中,可以通过继承`Thread`类或实现`Runnable`接口来创建多线程。在这个例子中,我们将探讨如何通过自定义...
这个名为"Java多线程的小例子——吃包子"的示例,旨在帮助开发者直观地理解多线程的工作原理。下面我们将深入探讨该示例所涉及的核心知识点。 首先,多线程通常涉及到以下几个关键概念: 1. **线程(Thread)**:...
Java多线程是Java编程中的重要概念,它允许程序同时执行多个任务,极大地提升了程序的效率和性能。在Java中,实现多线程有两种主要方式:通过实现Runnable接口或者继承Thread类。本案例将深入探讨Java多线程中的关键...
总的来说,Java多线程提供了丰富的功能,包括线程的创建、启动、中断、同步以及异常处理等。通过合理利用这些工具,开发者可以构建出高效、稳定且响应迅速的多线程应用程序。在实际编程中,要特别注意线程安全和性能...
5. **线程优先级**:每个线程都有一个优先级,Java中从1(`MIN_PRIORITY`)到10(`MAX_PRIORITY`),默认优先级是5(`NORM_PRIORITY`)。但优先级并不保证线程的执行顺序,它只是影响调度策略。 6. **线程池**:`...
### JAVA中的单线程与多线程概念解析 #### 单线程的理解 在Java编程环境中,单线程指的是程序执行过程中只有一个线程在运行。这意味着任何时刻只能执行一个任务,上一个任务完成后才会进行下一个任务。单线程模型...
在Java编程语言中,多线程是核心特性之一,它允许程序同时执行多个任务,从而提高了应用程序的效率和响应...文档“java多线程实例.docx”可能包含具体的示例代码和详细解释,建议参考学习,以加深对Java多线程的理解。
总之,Java多线程和异步调用是构建高效、响应迅速的应用程序的关键技术。通过合理利用这些工具和机制,开发者可以编写出能够充分利用多核处理器优势的代码,从而提高软件性能。在实际应用中,理解并熟练掌握这些概念...
Java 多线程访问的经典例子,一个个代码 手动敲出,可以加深或理解 多线程访问 线程安全与同步的问题.
一个线程从A表读数据放入队列 N个线程从队列中取出数据,找到其在子表中的数据 对子表中的数据开3种线程:读,发email,标记状态 N个线程对完成的A表数据做最后处理 支持大数据量跑批,就是个例子,本来是公司发送...
现在,让我们来看一个简单的订票系统的Java多线程示例。假设我们有一个票务系统,其中的`TicketService`类包含一个`tickets`变量表示剩余票数: ```java public class TicketService { private int tickets = 100;...
Java多线程是Java编程中的重要概念,它允许程序同时执行多个任务,提高了程序的效率和响应性。在Java中,实现多线程有两种主要方式:通过继承`Thread`类和实现`Runnable`接口。 1. 继承Thread类: 当你需要创建一...
Java多线程并发编程是Java开发中的重要领域,特别是在服务器端和高并发应用中不可或缺。`java.util.concurrent`包提供了丰富的工具类,帮助开发者更好地管理线程和优化并发性能。以下将详细介绍标题和描述中涉及的...