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()他释放了哪些锁?
当一个线程写好则通知第二个线程读
是一个锁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()他释放了哪些锁?
你这里写错了:
int len = pis.read();
这个不是得到长度而是第一字节数据。
因为:PipedInputStream与PipedOutputStream本身已经是做了同步与互拆处理的,专用于线程间通信用的。楼主都已经用了Piped流了,为何还要辛苦地加锁、解锁地做?似乎是多此一举啊。