多线程的开发中有一个最经典的操作案例, 就是生产者-消费者,生产者不断生产产品, 消费者不断取走产品。
一,多线程的关键点回顾
1.1 什么是进程?
程序是指令和数据的有序集合,其本身没有任何运行的含义,是一个静态的概念。而进程是程序在处理机上的一次 执行过程,它是一个动态的概念。
进程是一个具有一定独立功能的程序,一个实体,每一个进程都有它自己的地址空间。
1.2 进程的状态
运行中的进程具有以下三种基本状态:
- 就绪状态(Ready)
- 运行状态(Running)
- 阻塞状态(Blocked)
1.3 线程实现的方式
实现方式1:继承Thread类
class MyThread extends Thread{
public void run(){
//逻辑处理
}
}
MyThread mt = new MyThread();
mt.start();
实现方式2:实现Runnable接口
class MyRunnable implements Runnable{
public void run(){
//逻辑处理
}
}
MyRunnable mr = new MyRunnable();
Thread t = new Thread(mr);
t.start();
1.4 线程的状态
- New(初始化状态)
- Runnable(可运行/运行状态)
- Blocked(阻塞状态)
- Dead(终止状态)
注意一个区别:
线程的休眠:使用sleep方法实现,使当前正在执行的线程以指定的毫秒数暂停(暂时停止执行),释放CPU的时间片,具体取决于系统定时器和调度程序的精度和准确性。 线程不会丢失任何显示器的所有权。
线程等待:使用wait方法实现,让线程暂时停止执行,释放CPU的时间片,并释放对象监视器的所有权,等待其它线程通过 notify方法来唤醒。
二,生产者与消费者案列分析
饭店里的有一个厨师和一个服务员,这个服务员必须等待厨师准备好膳食。 当厨师准备好时,他会通知服务员,之后服务员上菜,然后返回继续等待。
这是一个任务协作的示例,厨师代表生产者,而服务员代表消费者。
//食物(两个线程需要共享的数据对象)
class Food{
private String name; //菜名
private String description; //菜的功效
private float price; //单价
private boolean flag = true; //true表示可以生产,false表示可以消费
public Food() {
}
public Food(String name,