- ベストアンサー
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 終了"); } }
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
これなんか、いちばん標準的で教科書的なサンプルだと思います: --------------------------------------------------------- /* 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]); } } -----------------------------------------------------
その他の回答 (1)
- auty
- ベストアンサー率58% (284/486)
これは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)も値を返すようにして、オーバーフローもわかるようにしたらよいかもしれません。