日期:2014-05-20  浏览次数:20690 次

郝斌视频中有段代码不懂,线程部分。请指教。谢谢
下面代码中,43.44.45.46;57.58.59.60行代码有点不懂。是不是为了调用SynStack中的方法呢?如果是,用继承可以嘛?下面还有段是使用继承的方法写打代码。可是两段代码运行结果不一样啊。求解脱,谢谢
class SynStack{
private char[] data = new char[6];
private int cnt = 0;

public synchronized void push(char ch){
while(cnt == data.length){
try{
this.wait();
}
catch(Exception e){
}
}
this.notify();

data[cnt] = ch;
++cnt;
System.out.printf("生产线程正在生产第%d个产品,该产品是%c\n", cnt, ch);
}

public synchronized char pop(){
char ch;

while(cnt == 0){
try{
this.wait();
}
catch(Exception e){
}
}
this.notify();

ch = data[cnt - 1];
System.out.printf("消费线程正在消费第%d个产品,该产品是%c\n", cnt, ch);
--cnt;
return ch;
}
}

class Producer implements Runnable{
SynStack ss ;//40行

public Producer(SynStack ss){//42行
this.ss = ss;//43行
}

public void run(){
char ch;

for(int i = 0; i < 20 ; ++i){
ch = (char)('A' + i);
ss.push(ch);
}
}
}

class Consumer implements Runnable{
private SynStack ss;//57行

public Consumer(SynStack ss){//59行
this.ss = ss;//60行
}

public void run(){
for(int i = 0; i < 20 ; ++i){
try{
Thread.sleep(100);
}
catch(Exception e){
}
ss.pop();
}
}
}

public class WWW{
public static void main(String[] args){
SynStack ss = new SynStack();
Producer p = new Producer(ss);
Consumer c = new Consumer(ss);
Thread t1 = new Thread(p);
t1.start();

Thread t2 = new Thread(c);
t2.start();
}
}
下面是使用继承方法的代码
class SynStack{
private char[] data = new char[6];
private int cnt = 0;

public synchronized void push(char ch){
while(cnt == data.length){
try{
this.wait();
}
catch(Exception e){
}
}
this.notify();

data[cnt] = ch;
++cnt;
System.out.printf("生产线程正在生产第%d个产品,该产品是%c\n", cnt, ch);
}

public synchronized char pop(){
char ch;

while(cnt == 0) {
try{
this.wait();
}
catch(Exception e){
}
}
this.notify();

ch = data[cnt - 1];
System.out.printf("消费线程正在消费第%d个产品,该产品是%c\n", cnt, ch);
--cnt;
return ch;
}
}

class Producer extends SynStack implements Runnable//用来生产的类
{
public void run(){
char ch;

for(int i = 0; i < 20 ; ++i){
ch = (char)('A' + i);
push(ch);
}
}
}

class Consumer extends SynStack implements Runnable{
public void run(){
for(int i = 0; i < 20 ; ++i){
try{
Thread.sleep(100);
}
catch(Exception e){
}
pop();
}
}
}

public class FFFF{
public static void main(String[] args){
// SynStack ss = new SynStack();
Producer p = new Producer();
Consumer c = new Consumer();
Thread t1 = new Thread(p);
t1.start();

Thread t2 = new Thread(c);
t2.start();
}
}

------解决方案--------------------
继承不可以,继承就是两个int cnt 和 char[] data 不是同一个对象。
------解决方案--------------------
——43.44.45.46;57.58.59.60行代码有点不懂。是不是为了调用SynStack中的方法呢?

没错。这里你需要保证,生产者生产的地方,和消费者消费的地方,是同一个数组。这个数组就是SynStack中的数组。并且,加锁必须在同一个对象上,这个对象就是ss对象。

如果你用继承,那么你创建的生产者和消费者将是两个不同的对象,生产者放产品的地方,和消费者取产品的地方不同。而且无法做到同步。