package multi_threading;
/*
- 实验11.4——线程同步机制
- 1.实验目的:
- 了解线程同步的基本思想
- 了解synchronized关键字的使用
- 2.实验要求:
- 编写一个Java程序,载程序中实现生产者与消费者过程
- 3.实验指导:
- 线程同步思想,是避免多个线程对统一资源的同时访问,对于这样的同步资源,
- Java语言使用synchronized关键字来标识,这里的资源可以是一种类型的数据,也就是对象,也可以是一个方法,还可以是一段代码
- 方式前面加关机字synchronized的方法或代码段,系统运行时都会位置分配一个互斥锁
- 这样就可以保证在同一时间,只有一个线程在享用这个资源,而不会别其他的线程在同一时刻共享
- Java语言Object类中提供了wait()和notify()两个方法,这两个方法只能在同步方法中被调用,执行wait()方法将使得
- 当前正在运行的线程暂时被挂起,从执行状态转为阻塞状态
- 同时该线程放弃占用的资源互斥锁
- 当有多个线程等待访问耨一同步资源时,他们会在该资源的互斥锁队列中排队等候
- wait()方法被调用后,其他线程就有机会获得资源,而被wait()挂起的线程将在互斥锁队列中排队等候notify()方法唤醒它
*/
public class ThreadSynchronized {
public static void main(String[] args) {
Common comm = new Common();
Producer p = new Producer(comm);
Consumer c = new Consumer(comm);
p.start();
c.start();
}
}
class Common{
private char ch;
private boolean available = false;
synchronized char get() {
while(available == false)
try {
wait();
}catch(InterruptedException e) {}
available = false;
notify();
return ch;
}
synchronized void put(char newch) {
//1.当available变量值为true时,一直挂起线程
while(available == true) {
try {
wait();
}catch(InterruptedException e){
}
}
ch = newch;
available = true;
//2.唤醒消费者线程
notify();
}
}
class Producer extends Thread{
//生产者
private Common comm;
public Producer(Common thiscomm) {
comm = thiscomm;
}
public void run() {
char c;
for(c='a';c<='e';c++) {
System.out.println("生产的数据是:"+c);
comm.put(c);
}
}
}
class Consumer extends Thread{
//消费者
private Common comm;
public Consumer(Common thiscomm) {
comm = thiscomm;
}
public void run() {
char c;
for(int i = 0;i<5;i++) {
c = comm.get();
System.out.println("消费者得到的数据是:"+c);
}
}
}