线程类部分:
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;
}}

解决方案 »

  1.   

    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()之中,没有被唤醒。
      

  2.   

    抱歉抱歉,第一次发帖。
    可以指导一下我妈,谢谢了
    不好意思有点事情,回复晚了 可以看看这个 http://bbs.csdn.net/topics/390335073
      

  3.   

    抱歉抱歉,第一次发帖。
    可以指导一下我妈,谢谢了
    不好意思有点事情,回复晚了 可以看看这个 http://bbs.csdn.net/topics/390335073
    我主要的需求是能够实现这三个线程之间的通信,不是有那个wait()和notify()方法用来实现这个功能吗,我自己添加之后发现能够运行程序,但是实际运行出来之后,有一个线程不能被唤醒,就想问下是怎么一回事,代码都贴出来了,最后一部分exchange1类的代码就是关于线程相互通信的,你帮我看看有什么问题
      

  4.   

    抱歉抱歉,第一次发帖。
    可以指导一下我妈,谢谢了
    不好意思有点事情,回复晚了 可以看看这个 http://bbs.csdn.net/topics/390335073
    我主要的需求是能够实现这三个线程之间的通信,不是有那个wait()和notify()方法用来实现这个功能吗,我自己添加之后发现能够运行程序,但是实际运行出来之后,有一个线程不能被唤醒,就想问下是怎么一回事,代码都贴出来了,最后一部分exchange1类的代码就是关于线程相互通信的,你帮我看看有什么问题
    抱歉最近比较忙
     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(); }
    }
    }
      
      

  5.   

    抱歉抱歉,第一次发帖。
    可以指导一下我妈,谢谢了
    不好意思有点事情,回复晚了 可以看看这个 http://bbs.csdn.net/topics/390335073
    我主要的需求是能够实现这三个线程之间的通信,不是有那个wait()和notify()方法用来实现这个功能吗,我自己添加之后发现能够运行程序,但是实际运行出来之后,有一个线程不能被唤醒,就想问下是怎么一回事,代码都贴出来了,最后一部分exchange1类的代码就是关于线程相互通信的,你帮我看看有什么问题
    抱歉最近比较忙
     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(); }
    }
    }
      你尝试着把我的代码调试下,notifyall我也试过,没有作用