总结:发送线程Sender().和接收线程Receiver()
虽然,这里的Sender()发送线程和Receiver()都有相同的睡眠时间,但是由于线程调度的不确定性,是的发送线程Sender每次发送的数据和接收线程Receiver每次
接收的数据不一样。而我们希望的是发送线程每次发送的数据都能够让接收线程Receiver正确的接收 到,这就必须增加方法的锁定机制。
package com.a.b; //package com.a.b; class Buffer2 {// 这里注意java源文件不是Buffer.java(文件名)否则运行出错。根本无法显示 private int value; // 这里java圆文件是任意的,但是绝对不是Buffer void put(int i) { value = i; } int get() { return value;// 返回值 } } class Sender extends Thread { // 发送线程 private Buffer bf; public Sender(Buffer bf) { this.bf = bf; } @Override public void run() { for (int i = 1; i < 6; i++) { bf.put(i);// 这个调用带参的put()方法 System.out.println("Sender put:" + i); try { sleep(i); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } public static void main(String[] args) { Buffer bf2 = new Buffer();// 这个和类名一致。否则报错 (new Sender(bf2)).start();// 这里的Sender这个类的构造方法里本来就有个参数,、、我疑问为什么这里的构造方法 // 调用线程的start()方法不是new一个线程的对象,而是一个类的,你看这个类不是继承了Thread类吗?也就是说它可以继承 // 线程类的属性和方法---------是可以的 (new Receiver(bf2)).start();// 这里的括号没有打上,那么它会调用的是什么方法呢?有什么关系呢? } } // 这里不是类的对象吗: class Receiver2 extends Thread {// 这是个类,和Sender是一样的? private Buffer bf; public Receiver2(Buffer bf) { this.bf = bf; } @Override public void run() { for (int i = 0; i < 6; i++) { System.out.println(" Receiver get:" + bf.get()); try { sleep(1); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } }