编写一个堆栈类MyStack,栈的大小为10个元素,每个元素可以放一个字符,实现相应

编写一个堆栈类MyStack,栈的大小为10个元素,每个元素可以放一个字符,实现相应的方法。再编写两个线程,线程PushChar包含一个MyStack对象,其线程方法调用MyStack的入栈方法,往MyStack对象中压入随机产生的字符;线程PopChar调用MyStack的出栈方法,取出压入的字符。要求入栈方法和出栈方法是多线程安全的,即是同步的。要求实现两个线程的交互,PushChar做入栈操作时如果发现栈满,则等待PopChar出栈;PopChar出栈操作时发现栈空,则等待PushChar入栈。

import java.lang.Thread;
public class MyStack
{
private int idx = 0;
char[ ] data = new char[10];
public boolean empty()
{
if (idx==0)
return true;
else
return false;
}
public boolean full()
{
if (idx==10)
return true;
else
return false;
}
public void push( char c )
{
synchronized(this)
{
data[idx] = c ;
idx ++ ;
}
}
public char pop( )
{
synchronized(this)
{
idx-- ;
return data[idx] ;
}
}
public char RandomLetter()
{
char[ ] letter= {'a','b','c','d','e','f','g','h','i','j','k','l','m',
'n','o','p','q','r','s','t','u','v','w','x','y','z'};
int i=(int)(Math.random()*26);
return letter[i];
}
public int getidx()
{
return idx;
}
public static void main(String args[ ])
{
MyStack m=new MyStack();
Thread pop = new Thread(new PopChar(m));
Thread push= new Thread(new PushChar(m));
pop.start( );
push.start( );
}
}
class PopChar implements Runnable
{
int i=0;
MyStack s;
public PopChar(MyStack m)
{
s=m;
}
public void run( )
{
while( true)
{
synchronized(s)
{
if(s.empty())
{
try {
s.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
else if(s.full())
{
char temp=s.pop();
System.out.println(temp+"出栈 栈中元素个数为"+s.getidx());
s.notifyAll();
}
else
{
char temp=s.pop();
System.out.println(temp+"出栈 栈中元素个数为"+s.getidx());
}
try {
Thread.sleep((long) (Math.random()*500));
} catch (InterruptedException e) {
e.printStackTrace();
}
i++;
if(i==20)
break;
}
}
}
}

class PushChar implements Runnable
{
int i=0;
MyStack s;
public PushChar(MyStack m)
{
s=m;
}
public void run( )
{
while( true)
{
synchronized(s)
{
if(s.full())
{
try {
s.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
else if(s.empty())
{
char temp=s.RandomLetter();
s.push(temp);
System.out.println(temp+"入栈 栈中元素个数为"+s.getidx());
s.notifyAll();
}
else
{
char temp=s.RandomLetter();
s.push(temp);
System.out.println(temp+"入栈 栈中元素个数为"+s.getidx());
}
try {
Thread.sleep((long) (Math.random()*500));
} catch (InterruptedException e) {
e.printStackTrace();
}
i++;
if(i==20)
break;
}
}
}
}
温馨提示:答案为网友推荐,仅供参考
相似回答