A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 秦大忠 中级黑马   /  2013-8-28 01:23  /  1340 人查看  /  9 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 潘才新 于 2013-8-29 01:12 编辑

package com.qindazhong;
import java.util.*;
class MyNumber1{
private List<Integer> list = new ArrayList<Integer>();
public void push(int i){
  synchronized(this){
   if(!list.isEmpty()){
    try{
     Thread.sleep(100);
    }
    catch(Exception e){}
   }else{
    list.add(new Integer(i));
   }
  }
}

public void pop(){
  synchronized(this){
   if(list.isEmpty()){
    try{
     Thread.sleep(100);
    }catch(Exception e){}
   }else{
    Iterator<Integer> it = list.iterator();
    while(it.hasNext()){
     System.out.println(it.next());
    }
    list.clear();
   }
  }
}
}
class Productor implements Runnable{
private MyNumber1 myNumber;
public void run(){
  myNumber.push(new Random().nextInt(new Integer(9)));
}
}
class Consummer implements Runnable{
private MyNumber1 myNumber ;
public void run(){
  myNumber.pop();
}
}
public class Demo3 {
public static void main(String[] args){
  Thread d1 = new Thread(new Productor());
  Thread d2 = new Thread(new Consummer());
  d1.start();
  d2.start();
}
}

跑出的异常是,空指正异常,run方法中的语句 myNumber.push(new Random().nextInt(new Integer(9)));
和语句myNumber.pop();,怎么会出现空指针异常啊,纠结得我都睡不着啊!!!!!!!!


评分

参与人数 1技术分 +1 收起 理由
潘才新 + 1 赞一个!

查看全部评分

9 个回复

倒序浏览
仁兄啊 你这个两个myNumber都没实例化就直接用?靠谱么  多说一句啊 两个myNumber中的list不是同一个,所以打印不出东西。你再瞅瞅
  1. package com.bbs;

  2. import java.util.*;

  3. class MyNumber1 {
  4.         private List<Integer> list = new ArrayList<Integer>();

  5.         public void push(int i) {
  6.                 synchronized (this) {
  7.                         if (!list.isEmpty()) {
  8.                                 try {
  9.                                         Thread.sleep(100);
  10.                                 } catch (Exception e) {
  11.                                 }
  12.                         } else {
  13.                                 list.add(new Integer(i));
  14.                         }
  15.                 }
  16.         }

  17.         public void pop() {
  18.                 synchronized (this) {
  19.                         if (list.isEmpty()) {
  20.                                 try {
  21.                                         Thread.sleep(100);
  22.                                 } catch (Exception e) {
  23.                                 }
  24.                         } else {
  25.                                 Iterator<Integer> it = list.iterator();
  26.                                 while (it.hasNext()) {
  27.                                         System.out.println(it.next());
  28.                                 }
  29.                                 list.clear();
  30.                         }
  31.                 }
  32.         }
  33. }

  34. class Productor implements Runnable {
  35.         private MyNumber1 myNumber = new MyNumber1();;

  36.         public void run() {
  37.                 myNumber.push(new Random().nextInt(new Integer(9)));
  38.         }
  39. }

  40. class Consummer implements Runnable {
  41.         private MyNumber1 myNumber = new MyNumber1();

  42.         public void run() {
  43.                 myNumber.pop();
  44.         }
  45. }

  46. public class Demo3 {
  47.         public static void main(String[] args) {
  48.                 Thread d1 = new Thread(new Productor());
  49.                 Thread d2 = new Thread(new Consummer());
  50.                 d1.start();
  51.                 d2.start();
  52.         }
  53. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
潘才新 + 1

查看全部评分

回复 使用道具 举报
昨晚小酌了几杯,晕乎晕乎的居然再写代码,我再仔细看看,谢谢你那么晚了还回我的帖子
回复 使用道具 举报
仁兄,确实打印不出东西来诶,list我不是定义为MyNumber1中的成员变量吗?他们怎么就不是一样的了呢?
回复 使用道具 举报
大哥,你两个类实现RUN接口分别调用PUSH,POP,调用的对象不同,锁也不一样,同步=废了啊?
回复 使用道具 举报
首先你没有创建 MyNumber1的实例对象就直接调用当然回报空指针异常
然后即使你创建了实例对象也不会有任何输出
你声明了两个多线程的类每个多线程类中都有一个MyNumber1实例对象
你的输入和输出不是同一对象
你把代码改成如下应该就行了
  1. import java.util.*;

  2. class MyNumber1 {
  3.         private List<Integer> list = new ArrayList<Integer>();

  4.         public void push(int i) {
  5.                 synchronized (this) {
  6.                         if (!list.isEmpty()) {
  7.                                 try {
  8.                                         Thread.sleep(100);
  9.                                 } catch (Exception e) {
  10.                                 }
  11.                         } else {
  12.                                 list.add(new Integer(i));
  13.                         }
  14.                 }
  15.         }

  16.         public void pop() {
  17.                 synchronized (this) {
  18.                         if (list.isEmpty()) {
  19.                                 try {
  20.                                         Thread.sleep(100);
  21.                                 } catch (Exception e) {
  22.                                 }
  23.                         } else {
  24.                                 Iterator<Integer> it = list.iterator();
  25.                                 while (it.hasNext()) {
  26.                                         System.out.println(it.next());
  27.                                 }
  28.                                 list.clear();
  29.                         }
  30.                 }
  31.         }
  32. }

  33. class Productor implements Runnable {
  34.         private MyNumber1 myNumber;
  35.         public Productor(MyNumber1 myNumber) {
  36.                 this.myNumber = myNumber;
  37.         }
  38.         public void run() {
  39.                 myNumber.push(new Random().nextInt(new Integer(9)));
  40.         }
  41. }

  42. class Consummer implements Runnable {
  43.         private MyNumber1 myNumber =  new MyNumber1();
  44.         public Consummer(MyNumber1 myNumber) {
  45.                 this.myNumber = myNumber;
  46.         }
  47.         public void run() {
  48.                 myNumber.pop();
  49.         }
  50. }

  51. public class Demo3 {
  52.         public static void main(String[] args) {
  53.                 MyNumber1 myNumber = new MyNumber1();
  54.                 Thread d1 = new Thread(new Productor(myNumber));
  55.                 Thread d2 = new Thread(new Consummer(myNumber));
  56.                 d1.start();
  57.                 d2.start();
  58.         }
  59. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
潘才新 + 1 鼓励鼓励

查看全部评分

回复 使用道具 举报
楼主如果问题已解决,请将未解决改为已解决
回复 使用道具 举报
怎么设置为已解决?
回复 使用道具 举报
狐灵 中级黑马 2013-8-28 23:31:41
9#
秦大忠 发表于 2013-8-28 09:26
昨晚小酌了几杯,晕乎晕乎的居然再写代码,我再仔细看看,谢谢你那么晚了还回我的帖子 ...

我也是碰巧下班特晚 还没睡 就上论坛逛逛

回复 使用道具 举报
秦大忠 发表于 2013-8-28 15:57
怎么设置为已解决?

重新编辑。换成已解决。还有就是,在你发表的帖子里回复别人的话,在他左下角点回复,不然别人收不到你信息。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马