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()他释放了哪些锁?
解决方案 »
- 请问这如何解决??找了好久都没找着问题
- 求一本,关于JVM虚拟机的好书。
- JNLP:Unable to create a shortcut for XXX
- 一个画网格的问题求教?数字怎么显示成黑点了?
- 我最近在设计GUI,里面用到了java的IO,但是有一个问题一直没有解决,还请高手帮帮我。我是实在没有办法了,实在很郁闷。
- 谁用过JBUILDER 2007啊
- 工具栏按钮图标问题
- 报JAVA虚拟机的错误,可能是硬件导致的吗?急!
- JDBC的问题?
- 請問Borland Enterprise Server5.0在那裡有下載呢?JBuilder6.0有自帶的嗎?
- 通过正则表达式提取数据的问题
- 树形控件初始显示时节点文字没有全部显示出来
你这里写错了:
int len = pis.read();
这个不是得到长度而是第一字节数据。
因为:PipedInputStream与PipedOutputStream本身已经是做了同步与互拆处理的,专用于线程间通信用的。楼主都已经用了Piped流了,为何还要辛苦地加锁、解锁地做?似乎是多此一举啊。