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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 吴凯 于 2013-5-1 01:37 编辑

编程实现:线程A向队列Q中不停写入数据,线程B从队列Q中不停读取数据(只要Q中有数据)。

评分

参与人数 1技术分 +1 收起 理由
张熙韬 + 1

查看全部评分

15 个回复

倒序浏览
接口中有两个一个是向队列中写push方法 一个是从队列中读。

public interface StackInterface

{

public void push(int n);

public int[] pop();

}

上边接口的实现类。

public class SafeStack implements StackInterface {

private int top = 0;

private int[] values = new int[10];

private boolean dataAvailable = false;

public void push(int n) {

synchronized (this) {

while (dataAvailable) // 1

{

try {

wait();

} catch (InterruptedException e) {

// 忽略 //2

}

}

values[top] = n;

System.out.println(“压入数字” + n + “步骤1完成”);

top++;

dataAvailable = true;

notifyAll();

System.out.println(“压入数字完成”);

}

}

public int[] pop() {

synchronized (this) {

while (!dataAvailable) // 3

{

try {

wait();

} catch (InterruptedException e) {

// 忽略 //4

}

}

System.out.print(“弹出”);

top–;

int[] test = { values[top], top };

dataAvailable = false;

// 唤醒正在等待压入数据的线程

notifyAll();

return test;

}

}

}

读线程

public class PopThread implements Runnable

{

private StackInterface s;

public PopThread(StackInterface s)

{

this.s = s;

}

public void run()

{

while(true)

{

System.out.println(“->”+ s.pop()[0] + “<-”);

try {

Thread.sleep(100);

}

catch(InterruptedException e){}

}

}

}

写线程

public class PushThread implements Runnable

{

private StackInterface s;

public PushThread(StackInterface s)

{

this.s = s;

}

public void run()

{

int i = 0;

while(true)

{

java.util.Random r = new java.util.Random();

i = r.nextInt(10);

s.push(i);

try {

Thread.sleep(100);

}

catch(InterruptedException e){}

}

}

}







不一定对,如果不对,请见谅。
这个版主肯定会的啊,楼上哥们幽默了。。。

点评

建议把相应的注释加上,这样会清晰些,谢谢  发表于 2013-4-27 12:18

评分

参与人数 1技术分 +2 收起 理由
黄玉昆 + 2

查看全部评分

回复 使用道具 举报
韩冬 发表于 2013-4-27 00:03
接口中有两个一个是向队列中写push方法 一个是从队列中读。

public interface StackInterface

呵呵... 给版主开个玩笑 .
回复 使用道具 举报
  1. //接口中有两个 一个是向队列中写push方法  一个是从队列中读
  2. public interface StackInterface {
  3.     public void push(int n);

  4.     public int[] pop();
  5. }

  6. // 上边接口的实现类。
  7. public class SafeStack implements StackInterface {
  8.     private int top = 0;
  9.     private int[] values = new int[10];
  10.     private boolean dataAvailable = false;

  11.     public void push(int n) {
  12.         synchronized (this) {
  13.             while (dataAvailable) {
  14.                 try {
  15.                     wait();
  16.                 } catch (InterruptedException e) {

  17.                 }
  18.             }
  19.             values[top] = n;
  20.             System.out.println("压入数字" + n + "步骤1完成");
  21.             top++;
  22.             dataAvailable = true;
  23.             notifyAll();
  24.             System.out.println("压入数字完成");
  25.         }
  26.     }

  27.     public int[] pop() {
  28.         synchronized (this) {
  29.             while (!dataAvailable) {
  30.                 try {
  31.                     wait();
  32.                 } catch (InterruptedException e) {

  33.                 }
  34.             }
  35.             System.out.println("弹出");
  36.             top--;
  37.             int[] test = {values[top],top};
  38.             dataAvailable = false;
  39.             //唤醒正在等待压入数据的线程
  40.             notifyAll();
  41.             return test;
  42.         }
  43.     }
  44. }
  45. //读线程
  46. public class PopThread implements Runnable{
  47.     private StackInterface s;
  48.     public PopThread(StackInterface s){
  49.         this.s = s;
  50.     }
  51.     public void run(){
  52.         while(true){
  53.             System.out.println("-->"+s.pop()[0]+"<--");
  54.             try{Thread.sleep(100);
  55.             }catch(InterruptedException e){
  56.                
  57.             }
  58.         }
  59.     }
  60. }
  61. //写线程
  62. public class PushThread implements Runnable{
  63.     private StackInterface s;
  64.     public PushThread(StackInterface s){
  65.         this.s = s;
  66.     }
  67.     public void run(){
  68.         int i = 0;
  69.         while(true){
  70.             java.util.Random r = new java.util.Random();
  71.             i = r.nextInt(10);
  72.             s.push(i);
  73.             try{
  74.                 Thread.sleep(100);
  75.             }catch(InterruptedException e){}
  76.         }
  77.     }
  78. }
复制代码
详情请参阅http://blog.sina.com.cn/s/blog_a3d2346f0101564t.html

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1 很给力!

查看全部评分

回复 使用道具 举报
这哥们在玩火
回复 使用道具 举报
public int[] pop();
}

// 上边接口的实现类。
public class SafeStack implements StackInterface {
    private int top = 0;
    private int[] values = new int[10];
    private boolean dataAvailable = false;

    public void push(int n) {
        synchronized (this) {
            while (dataAvailable) {
                try {
                    wait();
                } catch (InterruptedException e) {

                }
            }
            values[top] = n;
            System.out.println("压入数字" + n + "步骤1完成");
            top++;
            dataAvailable = true;
            notifyAll();
            System.out.println("压入数字完成");
        }
    }

    public int[] pop() {
        synchronized (this) {
            while (!dataAvailable) {
                try {
                    wait();
                } catch (InterruptedException e) {

                }
            }
            System.out.println("弹出");
            top--;
            int[] test = {values[top],top};
            dataAvailable = false;
            //唤醒正在等待压入数据的线程
            notifyAll();
            return test;
        }
    }
}
//读线程
public class PopThread implements Runnable{
    private StackInterface s;
    public PopThread(StackInterface s){
        this.s = s;
    }
    public void run(){
        while(true){
            System.out.println("-->"+s.pop()[0]+"<--");
            try{Thread.sleep(100);
            }catch(InterruptedException e){
               
            }
        }
    }
}
//写线程
public class PushThread implements Runnable{
    private StackInterface s;
    public PushThread(StackInterface s){
        this.s = s;
    }
    public void run(){
        int i = 0;
        while(true){
            java.util.Random r = new java.util.Random();
            i = r.nextInt(10);
            s.push(i);
            try{
                Thread.sleep(100);
            }catch(InterruptedException e){}
        }
    }
}

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
吴凯 中级黑马 2013-4-27 00:17:44
7#
孙百鑫 发表于 2013-4-27 00:10
这哥们在玩火

呵呵 ...
回复 使用道具 举报
都这么给力呢
回复 使用道具 举报
吴凯 中级黑马 2013-4-27 00:18:13
9#
多谢楼上的哥们解答 我尝试下 ..谢谢
回复 使用道具 举报
版主应该做做的,做出来了就不给他加分。
回复 使用道具 举报
张熙韬 发表于 2013-4-27 09:23
哥们,你知不知道你这标题,额,弄的我有想做的冲动呢!
给力啊!
哈哈,最近事情比较多,比较繁琐,改日有空一定和 ...

哈哈,张版主是禽兽,这个可以会
回复 使用道具 举报
陈雨 发表于 2013-4-27 09:32
版主应该做做的,做出来了就不给他加分。

这个建议好,直接没时间看帖了
回复 使用道具 举报
楼主你好,如果问题你已经整明白了,就把帖子的类型改为“已解决”{:soso_e181:}
回复 使用道具 举报
袁梦希 发表于 2013-4-27 10:44
楼主你好,如果问题你已经整明白了,就把帖子的类型改为“已解决” ...

已经修改了..不好意思 新手. 给各位版主添麻烦了
回复 使用道具 举报
曹睿翔 发表于 2013-4-27 10:02
这个建议好,直接没时间看帖了

嘿嘿..让版主郁闷了 :lol
回复 使用道具 举报
张熙韬 发表于 2013-4-27 09:23
哥们,你知不知道你这标题,额,弄的我有想做的冲动呢!
给力啊!
哈哈,最近事情比较多,比较繁琐,改日有空一定和 ...

呵呵  多谢给为版主....
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马