2个线程之间的通讯,含有同步问题
当一个线程写好则通知第二个线程读
是一个锁import java.io.*;
class Mark
{
static boolean bfull = true;
}
public class Piped implements Runnable{
 Mark ;
 public Piped(Mark )
 {
  this.=;
 }
 PipedOutputStream pos = new PipedOutputStream();
 public PipedOutputStream getPOS()
 {
  return pos;
 }
 public void run()
 {
  while(true)
  {
  synchronized ()
  {
  if(.bfull==false)
  try{.wait();}catch(Exception e){}
  try
  {
  pos.write("welcome to china".getBytes());
  pos.flush();
  }
  catch(Exception e){}
  .bfull=false;
  .notify();
  }
  }
 }
public static void main(String[] args)throws Exception {
Mark  = new Mark();
Piped f = new Piped();
Receiver j = new Receiver();
PipedInputStream pis = j.getPIS();
PipedOutputStream pos = f.getPOS();
pis.connect(pos);
new Thread(f).start();
new Thread(j).start();
}
}
class Receiver implements Runnable
{
Mark ;
public Receiver(Mark )
{
this. = ;
}
PipedInputStream pis = new PipedInputStream();
public PipedInputStream getPIS()
{
return pis;
}
public void run()
{
byte buf[] = new byte [1024];
while(true)
{
synchronized ()
{
if(.bfull==true)
try{.wait();}catch(Exception e){}
try
{
int len = pis.read();
System.out.println (len);
pis.read(buf,0,len);
System.out.println (new String(buf,0,len));
}
catch(Exception e){}
.bfull=true;
.notify();
}
}
}
}1.当里面的true改为false时就出现阻塞,一直等待状态,为什么?
2.为什么里面len我的机器上面打印出来是109?打印出来的是elcome to chinaaaaaaaaaaaaaaaaaaaaaaaaaaaaa...一共109个
3.而且我在DOS界面下没有w出来?就是elcome to chinaaaaaaaaaaaaaaaaaaaaaaaaaaaaa...
4.能说说.wait()他释放了哪些锁?

解决方案 »

  1.   

    问题2,3
    你这里写错了:
    int len = pis.read();
    这个不是得到长度而是第一字节数据。
      

  2.   

    问题4 .wait 使当前占用的线程进入等待,并释放当前同步锁,就是啦。
      

  3.   

    答:是不明白楼主为何要如此辛苦这样做
    因为:PipedInputStream与PipedOutputStream本身已经是做了同步与互拆处理的,专用于线程间通信用的。楼主都已经用了Piped流了,为何还要辛苦地加锁、解锁地做?似乎是多此一举啊。