//采用信号量和同步方法使发送线程与接收线程同步运行
public class BufferLock { /**
* @param args
*/
private int value;
private boolean isEmpty=true;
public synchronized void put(int i)
{
while(!isEmpty) //当value不空时,等待
try
{
this.wait(); //使调用该方法的当前线程等待,即阻塞自己
}
catch(InterruptedException e) {}
value =i; //当value空时,value获得值
isEmpty=false; //设置value为不空状态
notify(); //唤醒其他等待线程
}
public synchronized int get()
{
while(isEmpty)
try
{
this.wait();
}
catch(InterruptedException e)
{}
isEmpty=true;
notify();
return value;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
BufferLock buffer=new BufferLock();
(new Sender(buffer)).start();
(new Receiver(buffer)).start();
}
}
class Sender extends Thread
{
private BufferLock buffer;
public Sender(BufferLock buffer)
{
this.buffer=buffer;
}
public void run()
{
for(int i=1;i<6;i++)
{
buffer.put(i);
System.out.println("Sender put:"+i);
}
}
}
class Receiver extends Thread
{
private BufferLock buffer;
public Receiver(BufferLock buffer)
{
this.buffer=buffer;
}
public void run()
{
for(int i=1;i<6;i++)
{
System.out.println("\t\t\tReceiver get:"+buffer.get());
}
}
}
在myEclipse中运行如下:
Sender put:1
Sender put:2
Receiver get:1
Receiver get:2
Sender put:3
Sender put:4
Receiver get:3
Receiver get:4
Sender put:5
Receiver get:5为什么是这样两条两条的交替输出啊?难道不是应该相互交替的运行吗?
为什么不是这样:Sender put:1
Receiver get:1
Sender put:2
Receiver get:2
...这样的啊?
public class BufferLock { /**
* @param args
*/
private int value;
private boolean isEmpty=true;
public synchronized void put(int i)
{
while(!isEmpty) //当value不空时,等待
try
{
this.wait(); //使调用该方法的当前线程等待,即阻塞自己
}
catch(InterruptedException e) {}
value =i; //当value空时,value获得值
isEmpty=false; //设置value为不空状态
notify(); //唤醒其他等待线程
}
public synchronized int get()
{
while(isEmpty)
try
{
this.wait();
}
catch(InterruptedException e)
{}
isEmpty=true;
notify();
return value;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
BufferLock buffer=new BufferLock();
(new Sender(buffer)).start();
(new Receiver(buffer)).start();
}
}
class Sender extends Thread
{
private BufferLock buffer;
public Sender(BufferLock buffer)
{
this.buffer=buffer;
}
public void run()
{
for(int i=1;i<6;i++)
{
buffer.put(i);
System.out.println("Sender put:"+i);
}
}
}
class Receiver extends Thread
{
private BufferLock buffer;
public Receiver(BufferLock buffer)
{
this.buffer=buffer;
}
public void run()
{
for(int i=1;i<6;i++)
{
System.out.println("\t\t\tReceiver get:"+buffer.get());
}
}
}
在myEclipse中运行如下:
Sender put:1
Sender put:2
Receiver get:1
Receiver get:2
Sender put:3
Sender put:4
Receiver get:3
Receiver get:4
Sender put:5
Receiver get:5为什么是这样两条两条的交替输出啊?难道不是应该相互交替的运行吗?
为什么不是这样:Sender put:1
Receiver get:1
Sender put:2
Receiver get:2
...这样的啊?
但是没有得到你想要的输出,问题的关键在于:你不应该把输出写到线程里
比如:
buffer.put(i);
System.out.println("Sender put:"+i);
这事是存取的两行代码,但是当这个写线程执行完这两行代码的时候,
读线程可能才只执行完 System.out.println("\t\t\tReceiver get:"+buffer.get()); 这段代码的 buffer.get()这个方法,
而此时此刻,读线程还没执行完这行System.out.println("\t\t\tReceiver get:"+buffer.get());代码的System.out。printLn部分,
而写线程又去执行put方法,
所以可能会出现
你的那种输出结果,其实如果你多运行几次输出结果都是不确定的你的意思无非是想看两个线程交替读和写,你应该把输出部分写到 BufferLock 中代码如下:/**
* @author Anders
*/
public class BufferLock { private int value;
private boolean isEmpty = true; public synchronized void put(int i) {
while (!isEmpty)
// 当value不空时,等待
try {
this.wait(); // 使调用该方法的当前线程等待,即阻塞自己
} catch (InterruptedException e) {
}
value = i; // 当value空时,value获得值
isEmpty = false; // 设置value为不空状态
System.out.println("PID : " + Thread.currentThread().getId() + " put :" + i);
notify(); // 唤醒其他等待线程 } public synchronized int get() {
while (isEmpty)
try {
this.wait(); } catch (InterruptedException e) {
}
isEmpty = true;
notify();
System.out.println("\t\t\tPID : " + Thread.currentThread().getId() + " get :" + value);
return value; } public static void main(String[] args) {
// TODO Auto-generated method stub
BufferLock buffer = new BufferLock();
(new Sender(buffer)).start();
(new Receiver(buffer)).start();
}
}class Sender extends Thread {
private BufferLock buffer; public Sender(BufferLock buffer) {
this.buffer = buffer;
} public void run() {
for (int i = 1; i < 6; i++) {
buffer.put(i);
// System.out.println( System.currentTimeMillis() + " Sender put:"
// + i);
}
}
}class Receiver extends Thread {
private BufferLock buffer; public Receiver(BufferLock buffer) {
this.buffer = buffer;
} public void run() {
for (int i = 1; i < 6; i++) {
buffer.get();
// System.out.println("\t\t\t"+ System.currentTimeMillis() +
// " Receiver get:" + buffer.get());
}
}}