分享一个关于多线程的程序!!!

娟流韶华年 2016-04-23 10:48:07
线程类部分:
public class CheThreadExt extends Thread {

private String nameString;

public CheThreadExt(String name) {
this.nameString = name;
}

public void run() {
int i = 0 ;
while (i < Constant.allTimeInteger) { //时间 秒
try {

Thread.currentThread().sleep(1000);

CarObj carObj = CarSynTable.getOneCar(nameString);

carObj.setTimeInteger(carObj.getTimeInteger() + 1);
carObj.setJuliInteger(carObj.getJuliInteger()
+ carObj.getSpeedInteger());

CarSynTable.putOneCar(nameString, carObj) ;

i ++ ;

} catch (InterruptedException e) {
e.printStackTrace();
}

}
}

/**
* 代码执行
*
* @param args
*/
public static void main(String[] args) {
CheThreadExt thread1 = new CheThreadExt("Car_A");

CheThreadExt thread2 = new CheThreadExt("Car_B");

CheThreadExt thread3 = new CheThreadExt("Car_C");

thread1.start();

thread2.start();

thread3.start();

for(int i = 0 ; i < 10 ; i ++){

try {
Thread.currentThread().sleep(5000);

CarSynTable.printCurCarsInfo() ;

} catch (InterruptedException e) {
e.printStackTrace();
}

}

System.exit(0);

}
}
HashMap以及对象初始化部分:

public class CarSynTable {

private static HashMap<String, CarObj> carCurStatus = new HashMap<String, CarObj>();

public static synchronized void putOneCar(String thredNm, CarObj carobj) {
carCurStatus.put(thredNm, carobj);
}

public static synchronized CarObj getOneCar(String thredNm) {

if(null == carCurStatus.get(thredNm)){
return new CarObj(RandomUtil.getSpeed(), 0, 0);
}

return carCurStatus.get(thredNm);
}

public static synchronized HashMap<String, CarObj> getCarCurStatus() {
return carCurStatus;
}

public static synchronized void printCurCarsInfo() {
Set set = getCarCurStatus().entrySet();
Map.Entry[] entries = (Map.Entry[]) set.toArray(new Map.Entry[set.size()]);
for (int i = 0; i < entries.length; i++) {
CarObj carobj = (CarObj) entries[i].getValue();
System.out.println("CarName : " + entries[i].getKey().toString()
+ ", speed : " + carobj.getSpeedInteger() + ", time : "
+ carobj.getTimeInteger() + " , juli : "
+ carobj.getJuliInteger() + " !");
}
}
}

public class CarObj {

private Integer speedInteger = 0; // 速度

private Integer juliInteger = 0; // 距离

private Integer timeInteger = 0;// 时间

public CarObj() {

}
/**
*
* @param speed 米/秒
* @param juli 米
* @param time 秒
*/
public CarObj(Integer speed, Integer juli, Integer time) {
speedInteger = speed ;

juliInteger = juli ;

timeInteger = time ;
}

public Integer getSpeedInteger() {
return speedInteger;
}

public void setSpeedInteger(Integer speedInteger) {
this.speedInteger = speedInteger;
}

public Integer getJuliInteger() {
return juliInteger;
}

public void setJuliInteger(Integer juliInteger) {
this.juliInteger = juliInteger;
}

public Integer getTimeInteger() {
return timeInteger;
}

public void setTimeInteger(Integer timeInteger) {
this.timeInteger = timeInteger;
}

}
...全文
246 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
tangxheng 2016-04-28
  • 打赏
  • 举报
回复
线程间通信,可以用三方全局变量来达到效果。 有事的一方,主动把要求写到第三方变量去。 其它方不断的查看第三方变量,看到变化,再判断是不是要自己处理。 注意事项 1、第三方变量的同步性。 2、事情的处理会不会忙不过要求,导致要求爆棚
娟流韶华年 2016-04-26
  • 打赏
  • 举报
回复
引用 9楼Java-我去 的回复:
[quote=引用 8 楼 u013709217 的回复:] [quote=引用 6 楼 zsw12013 的回复:] [quote=引用 4 楼 u013709217 的回复:] [quote=引用 2 楼 zsw12013 的回复:] 又看见一个不回提问题的人
抱歉抱歉,第一次发帖。 可以指导一下我妈,谢谢了[/quote] 不好意思有点事情,回复晚了 可以看看这个 http://bbs.csdn.net/topics/390335073[/quote] 我主要的需求是能够实现这三个线程之间的通信,不是有那个wait()和notify()方法用来实现这个功能吗,我自己添加之后发现能够运行程序,但是实际运行出来之后,有一个线程不能被唤醒,就想问下是怎么一回事,代码都贴出来了,最后一部分exchange1类的代码就是关于线程相互通信的,你帮我看看有什么问题[/quote] 抱歉最近比较忙 1、在多线程环境中HashMap 是线程不安全的,可以用ConcurrentHashMap 2、造成阻塞的原因 exchange1 消费着生产者这儿写的有问题

  package Thread;
public class exchange1 
{
	private int number;
	
	public synchronized void decrease()
	 {  
		while(0 != number)
	  {
			try 
	      {
		    wait();
	      } 
			catch (InterruptedException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}
	      number++;
	 
	      notifyAll();
	
		}
	}

	public synchronized void increase()
	 {  
		while(0 == number)
	  {
			try 
	      {
		    wait();
	      } 
			catch (InterruptedException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}
	      number--;
	      notifyAll();

		}
	}
}

[/quote]你尝试着把我的代码调试下,notifyall我也试过,没有作用
Java-我去 2016-04-26
  • 打赏
  • 举报
回复
引用 8 楼 u013709217 的回复:
[quote=引用 6 楼 zsw12013 的回复:] [quote=引用 4 楼 u013709217 的回复:] [quote=引用 2 楼 zsw12013 的回复:] 又看见一个不回提问题的人
抱歉抱歉,第一次发帖。 可以指导一下我妈,谢谢了[/quote] 不好意思有点事情,回复晚了 可以看看这个 http://bbs.csdn.net/topics/390335073[/quote] 我主要的需求是能够实现这三个线程之间的通信,不是有那个wait()和notify()方法用来实现这个功能吗,我自己添加之后发现能够运行程序,但是实际运行出来之后,有一个线程不能被唤醒,就想问下是怎么一回事,代码都贴出来了,最后一部分exchange1类的代码就是关于线程相互通信的,你帮我看看有什么问题[/quote] 抱歉最近比较忙 1、在多线程环境中HashMap 是线程不安全的,可以用ConcurrentHashMap 2、造成阻塞的原因 exchange1 消费着生产者这儿写的有问题

  package Thread;
public class exchange1 
{
	private int number;
	
	public synchronized void decrease()
	 {  
		while(0 != number)
	  {
			try 
	      {
		    wait();
	      } 
			catch (InterruptedException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}
	      number++;
	 
	      notifyAll();
	
		}
	}

	public synchronized void increase()
	 {  
		while(0 == number)
	  {
			try 
	      {
		    wait();
	      } 
			catch (InterruptedException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}
	      number--;
	      notifyAll();

		}
	}
}

Java-我去 2016-04-23
  • 打赏
  • 举报
回复
又看见一个不回提问题的人
娟流韶华年 2016-04-23
  • 打赏
  • 举报
回复
引用 6 楼 zsw12013 的回复:
[quote=引用 4 楼 u013709217 的回复:] [quote=引用 2 楼 zsw12013 的回复:] 又看见一个不回提问题的人
抱歉抱歉,第一次发帖。 可以指导一下我妈,谢谢了[/quote] 不好意思有点事情,回复晚了 可以看看这个 http://bbs.csdn.net/topics/390335073[/quote] 我主要的需求是能够实现这三个线程之间的通信,不是有那个wait()和notify()方法用来实现这个功能吗,我自己添加之后发现能够运行程序,但是实际运行出来之后,有一个线程不能被唤醒,就想问下是怎么一回事,代码都贴出来了,最后一部分exchange1类的代码就是关于线程相互通信的,你帮我看看有什么问题
娟流韶华年 2016-04-23
  • 打赏
  • 举报
回复
如果在这个程序的基础之上,加入一个线程之间相互通信的功能,应该如何去做?
Java-我去 2016-04-23
  • 打赏
  • 举报
回复
引用 5 楼 u013709217 的回复:
public class CarObj {

	private Integer speedInteger = 0; // 速度

	private Integer juliInteger = 0; // 距离

	private Integer timeInteger = 0;// 时间
	

	public  CarObj() {
		
	}
	/**
	 * 
	 * @param speed 米/秒
	 * @param juli  米
	 * @param time  秒
	 */
	public  CarObj(Integer speed, Integer juli, Integer time) {
		speedInteger = speed ;
		
		juliInteger = juli ;
		
		timeInteger = time ;
		

	}
/*
 * 对对象进行封装
 * 
 */
	public Integer getSpeedInteger() {
		return speedInteger;
	}

	public void setSpeedInteger(Integer speedInteger) {
		this.speedInteger = speedInteger;
	}

	public Integer getJuliInteger() {
		return juliInteger;
	}

	public void setJuliInteger(Integer juliInteger) {
		this.juliInteger = juliInteger;
	}

	public Integer getTimeInteger() {
		return timeInteger;
	}

	public void setTimeInteger(Integer timeInteger) {
		this.timeInteger = timeInteger;
	}
	


}
public class CheThreadExt implements Runnable {

	private String nameString;

	public CheThreadExt(String name) {
		this.nameString = name;
	}

	public void run() {
		int i = 0 ;
		while (i < Constant.allTimeInteger) { //时间 秒
			try {
				
				Thread.currentThread().sleep(1000);
				
				CarObj carObj = CarSynTable.getOneCar(nameString);

				carObj.setTimeInteger(carObj.getTimeInteger() + 1);
				carObj.setJuliInteger(carObj.getJuliInteger()
						+ carObj.getSpeedInteger());
				
				CarSynTable.putOneCar(nameString, carObj) ; 

				i ++ ;
				
			} catch (InterruptedException e) {
				e.printStackTrace();
			}

		}
	}

	/**
	 * 代码执行
	 * 
	 * @param args
	 */
	public static void main(String[] args) {
		CheThreadExt mx = new CheThreadExt("Car_A");
		
		CheThreadExt mx1 = new CheThreadExt("Car_B");
		
		CheThreadExt mx2 = new CheThreadExt("Car_C");
		
		new Thread(mx,"Car_A").start();
		
		new Thread(mx1,"Car_B").start();
		
		new Thread(mx2,"Car_C").start();
		
		for(int i = 0 ; i < 10 ; i ++){
			
			try {
				Thread.currentThread().sleep(5000);
				
				CarSynTable.printCurCarsInfo() ;
				
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			
		}
		
		System.exit(0);
		
	}
}

public class RandomUtil {

	private static final Random random = new Random();

	public static synchronized int getSpeed() {

		return random.nextInt(50); // 随机数范围
	}

	
	public static void main(String args[]) {
		for(int i = 0 ; i < 100 ; i ++){
			System.out.println("getSpeed() : " + getSpeed());
		}
	}
}

public class Constant {

	public static Integer  allTimeInteger = 1000 ; //总共行走时间
}

public class CarSynTable {

	private static HashMap<String, CarObj> carCurStatus = new HashMap<String, CarObj>();

	public static synchronized void putOneCar(String thredNm, CarObj carobj) {
		carCurStatus.put(thredNm, carobj);
	}

	public static synchronized CarObj getOneCar(String thredNm) {
		
		if(null == carCurStatus.get(thredNm)){
			return new CarObj(RandomUtil.getSpeed(), 0, 0);
		}
		
		return carCurStatus.get(thredNm);
	}

	public static synchronized HashMap<String, CarObj> getCarCurStatus() {
		return carCurStatus;
	}

	public static synchronized void printCurCarsInfo() {
		Set set = getCarCurStatus().entrySet();
		Map.Entry[] entries = (Map.Entry[]) set.toArray(new Map.Entry[set.size()]);
		for (int i = 0; i < entries.length; i++) {
			CarObj carobj = (CarObj) entries[i].getValue();
			System.out.println("CarName : " + entries[i].getKey().toString()
					+ ",  speed : " + carobj.getSpeedInteger() + ", time : "
					+ carobj.getTimeInteger() + " , juli : "
					+ carobj.getJuliInteger() + " !");
		}
	}
}
这个是重新贴的,前面的很抱歉,第一次发帖,没注意规范,我就想问下,如何实现线程与线程之间的通信。
public class exchange1 
{
	private int number;
	
	public synchronized void decrease()
	 {  
		while(0 != number)
	  {
			try 
	      {
		    wait();
	      } 
			catch (InterruptedException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}
	      number--;
	 
	      notify();
	
		}
	}

	public synchronized void increase()
	 {  
		while(0 == number)
	  {
			try 
	      {
		    wait();
	      } 
			catch (InterruptedException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}
	      number++;
	     
	      notify();

		}
	}
}
比如这一部分代码,如何增加到原有的程序之中,我试着添加之后发现,有一个线程一直处于wait()之中,没有被唤醒。
说的太少,不知道你的需求是啥
Java-我去 2016-04-23
  • 打赏
  • 举报
回复
引用 4 楼 u013709217 的回复:
[quote=引用 2 楼 zsw12013 的回复:] 又看见一个不回提问题的人
抱歉抱歉,第一次发帖。 可以指导一下我妈,谢谢了[/quote] 不好意思有点事情,回复晚了 可以看看这个 http://bbs.csdn.net/topics/390335073
娟流韶华年 2016-04-23
  • 打赏
  • 举报
回复
public class CarObj {

	private Integer speedInteger = 0; // 速度

	private Integer juliInteger = 0; // 距离

	private Integer timeInteger = 0;// 时间
	

	public  CarObj() {
		
	}
	/**
	 * 
	 * @param speed 米/秒
	 * @param juli  米
	 * @param time  秒
	 */
	public  CarObj(Integer speed, Integer juli, Integer time) {
		speedInteger = speed ;
		
		juliInteger = juli ;
		
		timeInteger = time ;
		

	}
/*
 * 对对象进行封装
 * 
 */
	public Integer getSpeedInteger() {
		return speedInteger;
	}

	public void setSpeedInteger(Integer speedInteger) {
		this.speedInteger = speedInteger;
	}

	public Integer getJuliInteger() {
		return juliInteger;
	}

	public void setJuliInteger(Integer juliInteger) {
		this.juliInteger = juliInteger;
	}

	public Integer getTimeInteger() {
		return timeInteger;
	}

	public void setTimeInteger(Integer timeInteger) {
		this.timeInteger = timeInteger;
	}
	


}
public class CheThreadExt implements Runnable {

	private String nameString;

	public CheThreadExt(String name) {
		this.nameString = name;
	}

	public void run() {
		int i = 0 ;
		while (i < Constant.allTimeInteger) { //时间 秒
			try {
				
				Thread.currentThread().sleep(1000);
				
				CarObj carObj = CarSynTable.getOneCar(nameString);

				carObj.setTimeInteger(carObj.getTimeInteger() + 1);
				carObj.setJuliInteger(carObj.getJuliInteger()
						+ carObj.getSpeedInteger());
				
				CarSynTable.putOneCar(nameString, carObj) ; 

				i ++ ;
				
			} catch (InterruptedException e) {
				e.printStackTrace();
			}

		}
	}

	/**
	 * 代码执行
	 * 
	 * @param args
	 */
	public static void main(String[] args) {
		CheThreadExt mx = new CheThreadExt("Car_A");
		
		CheThreadExt mx1 = new CheThreadExt("Car_B");
		
		CheThreadExt mx2 = new CheThreadExt("Car_C");
		
		new Thread(mx,"Car_A").start();
		
		new Thread(mx1,"Car_B").start();
		
		new Thread(mx2,"Car_C").start();
		
		for(int i = 0 ; i < 10 ; i ++){
			
			try {
				Thread.currentThread().sleep(5000);
				
				CarSynTable.printCurCarsInfo() ;
				
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			
		}
		
		System.exit(0);
		
	}
}

public class RandomUtil {

	private static final Random random = new Random();

	public static synchronized int getSpeed() {

		return random.nextInt(50); // 随机数范围
	}

	
	public static void main(String args[]) {
		for(int i = 0 ; i < 100 ; i ++){
			System.out.println("getSpeed() : " + getSpeed());
		}
	}
}

public class Constant {

	public static Integer  allTimeInteger = 1000 ; //总共行走时间
}

public class CarSynTable {

	private static HashMap<String, CarObj> carCurStatus = new HashMap<String, CarObj>();

	public static synchronized void putOneCar(String thredNm, CarObj carobj) {
		carCurStatus.put(thredNm, carobj);
	}

	public static synchronized CarObj getOneCar(String thredNm) {
		
		if(null == carCurStatus.get(thredNm)){
			return new CarObj(RandomUtil.getSpeed(), 0, 0);
		}
		
		return carCurStatus.get(thredNm);
	}

	public static synchronized HashMap<String, CarObj> getCarCurStatus() {
		return carCurStatus;
	}

	public static synchronized void printCurCarsInfo() {
		Set set = getCarCurStatus().entrySet();
		Map.Entry[] entries = (Map.Entry[]) set.toArray(new Map.Entry[set.size()]);
		for (int i = 0; i < entries.length; i++) {
			CarObj carobj = (CarObj) entries[i].getValue();
			System.out.println("CarName : " + entries[i].getKey().toString()
					+ ",  speed : " + carobj.getSpeedInteger() + ", time : "
					+ carobj.getTimeInteger() + " , juli : "
					+ carobj.getJuliInteger() + " !");
		}
	}
}
这个是重新贴的,前面的很抱歉,第一次发帖,没注意规范,我就想问下,如何实现线程与线程之间的通信。
public class exchange1 
{
	private int number;
	
	public synchronized void decrease()
	 {  
		while(0 != number)
	  {
			try 
	      {
		    wait();
	      } 
			catch (InterruptedException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}
	      number--;
	 
	      notify();
	
		}
	}

	public synchronized void increase()
	 {  
		while(0 == number)
	  {
			try 
	      {
		    wait();
	      } 
			catch (InterruptedException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}
	      number++;
	     
	      notify();

		}
	}
}
比如这一部分代码,如何增加到原有的程序之中,我试着添加之后发现,有一个线程一直处于wait()之中,没有被唤醒。
娟流韶华年 2016-04-23
  • 打赏
  • 举报
回复
引用 2 楼 zsw12013 的回复:
又看见一个不回提问题的人
抱歉抱歉,第一次发帖。 可以指导一下我妈,谢谢了
残月飞鹰 2016-04-23
  • 打赏
  • 举报
回复
没有注释的代码不愿意看
Domain4.3(明小子)10.10.10更新版主要更新内容如下: 1.驱除部分死连接,恢复部分官方连接 2.改变默认显示页面为本人BLOG 3.修正程序在检测时出错的BUG 4.修正程序在部分系统中无法启动的BUG 5.加了一个功能模块,但还不成熟,隐藏了,高手的话可以用OD调出来!>!< 6.修复前段时间一些朋友反映的错误和程序宏 7.增加四款SKN皮肤! 10.10.11紧急更新: 1.修正新版程序在部分系统中启动后直接导致系统蓝屏的BUG 2.修正域名查询的几个错误 3.修正程序批量检测查询到域名的时候无反映的BUG! Domain4.2(明小子)10.01.16更新版主要更新内容如下: 1.删除所有无关数据 2.优化急速代码 3.改变启动线程 4.增加SQL数据批量导出功能 5.加入几个优化进程模块,非后门.后台运行. 6.锁定主程序栏目宽和高,不在恢复 7.删除“辅助工具”模块中全部代码 8.修正XP SP3 程序下兼容问题 9.重新改写域名查询旁站线程 程序于2010年01月16号调试完毕! 提别提示:第4个功能只能运行在完整版的windows XP 平台系统中,其他平台无法运行,如果出现恢复按钮并不能保存请自行调试与本程序无关.谢谢合作! 宝宝的话:有朋友们的鼓励才会有这个版本的发布,这当是我送给大家2010年里的第一个礼物吧。 Domain4.1(明小子)0901更新版主要更新内容如下: 1.增加新系统兼容模块,全面兼容2000-2008各系统 (部分精简版系统除外) 2.优化网站打开速度,删减部分无用内核信息,全面加快程序启动速度. 3.基于09.05.20号内核提升,改变搜查循环的一个死BUG! 4.删除在0520上增加的一个补针函数,并使用新的函数替换.保证不报错. 5.不在兼容xpsp3,因为没时间去修正这个错误。所以可能部分SP3系统运行不起来本程序 6.增加部分程序扩充空格代码,为下个版本更新做好铺垫 小提示:保留旧的IP反查连接系统,原因没有找到新的和稳定的IP反差服务器!如果有能提供的请与本人联系!谢谢合作 Domain4.1(明小子)0520更新版主要更新内容如下: 1.基于08.10.01号内核提升,修正一次关键错误。 2.替换原程序自带的那个小马,该为最新美化免杀版的小马! 3.添加一个服务器挂钩程序(非插件),使修改后的新内核兼容vista系统。 4.程序数据库默认名为:SetData.mdb 请大家使用3.5版本以上的MDB数据.其他低版本程序可能不兼容! 5.删除后台下载统计代码(以前没发现,本人也是从网站上面下的软件,排除作者自添加行为) 6.加了一个补针,针对sql注入功能中的一个小BUG。 7.删除了很多没有用的代码,最大限度的优化程序启动速度。 8.更新部分在xpsp3下出错的几个小BUG(小问题小解决,这个错误仅针对部分优化过度的XPSP3系统)。 提记:很多朋友说需要修改下程序IP域名查询功能,这里说明下.由于内核找不到关键句柄导致无法更新,下个版本在仔细看看! Domain4.0(明小子)1001更新版主要更新内容如下: 1.更新部分过度优化过的系统不兼容问题。 2.修改内存识别函数,使其降低软件在使用期间所占用的内存大小。 3.基于08.09.15号内核提升,修正因修改软件所出现的几个导致软件崩溃的几个BUG。 4.换了软件自带的那个垃圾皮肤。加入兼容美化皮肤!更美观! 5.兼容前版本数据库支持功能 6.去掉了没有用的PHP入侵选项和几处小BUG...... 转贴是一种美德!分享也是一种快乐,工具仅做辅助作用请勿用在非法用途上! 程序自带本BLOG连接,启动比较慢!不喜勿用!谢谢合作!

62,612

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧