みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

Threadに関するの質問

このプログラムに synchronized , wait(), notify()を加えることで、
stackBody[]配列をオーバーやアンダーフローしないようにできるのでしょうか。お助け下さい!


public class test
{
public static void main(String args[])
{
Stack stack = new Stack(5);

Pusher pusher = new Pusher(stack);
Popper popper = new Popper(stack);

pusher.start();
popper.start();
}
}

class Stack
{
private int stackSize;
private int stackPointer;
private int stackBody[];

public Stack(){
this(10);
}

public Stack(int size){
stackSize = size;
stackBody = new int[size];
stackPointer = 0;
}

public void push(int value){
if(stackSize == stackPointer){
//
}
stackBody[stackPointer++] = value;
}

public int pop(){
if(stackPointer == 0){
//
}
return stackBody[--stackPointer];
}
}

class Pusher extends Thread
{
Stack s;

public Pusher(Stack s) {
this.s = s;
}

public void run()
{
int n, interval;

for(int i = 0; i < 10; i ++) {
n = (int)(100.0 * Math.random());
interval = (int)(100.0 * Math.random());
s.push(n);
System.out.println("Pusher:" + n);

try{
Thread.sleep(interval);
}catch(InterruptedException e) {}
}
System.out.println("Push 終了");
}
}

class Popper extends Thread
{
Stack s;

public Popper(Stack s)
{
this.s = s;
}

public void run(){
int n, interval;

for(int i = 0; i < 10; i++){
interval = (int)(100.0 * Math.random());
n = s.pop();

System.out.println("Popper:" + n);

try{
Thread.sleep(interval);
}catch(InterruptedException e) {}
}

System.out.println("Popper 終了");
}
}

投稿日時 - 2008-02-04 00:47:28

QNo.3742487

困ってます

質問者が選んだベストアンサー

これなんか、いちばん標準的で教科書的なサンプルだと思います:
---------------------------------------------------------
/*
from:
The Java Class Library: Second Edition, Volume 1
by Patrick Chan, Rosanna Lee, and Douglas Kramer
*/
class Stack {
static final int STACK_SIZE = 3;
private int[] stack_store = new int[STACK_SIZE];
private int stack_ptr = 0;

// push item onto stack
// If stack is full, wait until it has room
synchronized public void push(int item) {
while (stack_ptr >= STACK_SIZE) {
try {
wait();
} catch (InterruptedException e) {
// ignore
}
}
if (stack_ptr == 0)
notify(); // pop was awaiting stack to fill
stack_store[stack_ptr++] = item;
}

// pop item off top of stack
// If stack is empty, wait until it has item
synchronized public int pop() {
while (stack_ptr == 0) {
try {
wait();
} catch (InterruptedException e) {
// ignore
}
}
if (stack_ptr >= STACK_SIZE)
notify(); // push was awaiting stack to drain
return(stack_store[--stack_ptr]);
}
}
-----------------------------------------------------

参考URL:http://java.sun.com/docs/books/chanlee/second_edition/vol1/

投稿日時 - 2008-02-04 08:20:39

ANo.2

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.1

これはthreadではなく、配列の添え字処理のときの不適切さ(returnの抜け)が問題です。
次のように修正してはどうでしょうか。
-----------------------------------------------
public void push(int value) {
if (stackSize <= stackPointer) {
return;
}
stackBody[stackPointer++] = value;
return;
}

public int pop() {
if (stackPointer == 0) {
return -1;
}
return stackBody[--stackPointer];
}
-----------------------------------------------
また出現回数は少ないかもしれませんがpush(int value)も値を返すようにして、オーバーフローもわかるようにしたらよいかもしれません。

投稿日時 - 2008-02-04 02:52:34

あなたにオススメの質問