Java线程的作用是可以使一个程序中的线程可以并行运行,这样可以大大缩短程序运行所需要的时间。但是当这些线程都对同一个变量或者内存进行操作的时候如果不加以控制就会出现许多不可预见的错误,而且在不同时间运行也会产生不同的错误,并且很难排查。
对于生产者和消费者之间的关系,必须保证它们不能同时对一个存储进行修改,即当生产者在工作时,消费者必须等候其生产完成,消费者在消费时同理,生产者也必须等候消费者工作完成之后再进行工作。下面的代码实现的是一个生产者和一个消费者之间的工作。它们分别生产和消费5次。
容器类:生产者和消费者都在容器中进行工作
package prodecerAndConsumer20181016.thread;
public class Basket {
static int COUNT = 0;//容量
public synchronized void get(int i) {
if(COUNT<=0) {//如果容器中没有东西则挂起等待
try {
this.wait();//挂起
} catch (InterruptedException e) {
e.printStackTrace();
}
}
int tem = COUNT;
tem = tem - 100;
COUNT = tem;
System.out.println("第"+i+"次取钱后,余额为:"+COUNT);
this.notifyAll();
}
public synchronized void put(int i) {
if(COUNT>=300) {//若容器中已经存满则挂起等待
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
int tem = COUNT;
tem = tem + 100;
COUNT = tem;
System.out.println("第"+i+"次存钱后,余额为:"+COUNT);
this.notifyAll();
}
}
生产者类
package prodecerAndConsumer20181016.thread;
public class Producer extends Thread{
Basket basket;
public Producer(Basket basket) {
super();
this.basket = basket;
}
public void run() {
for(int i=0;i<5;i++) {
basket.put(i);//放入
}
}
}
消费者类
package prodecerAndConsumer20181016.thread;
public class Consumer extends Thread{
Basket basket;
public Consumer(Basket basket) {
super();
this.basket = basket;
}
public void run() {
for(int i=0;i<5;i++) {
basket.get(i);
}
}
}
主函数调用
package prodecerAndConsumer20181016.Main;
import prodecerAndConsumer20181016.thread.Consumer;
import prodecerAndConsumer20181016.thread.Producer;
import prodecerAndConsumer20181016.thread.Basket;
public class Main {
public static void main(String[] args) throws InterruptedException {
Basket basket = new Basket();
Consumer consumer = new Consumer(basket);
Producer producer = new Producer(basket);
consumer.start();
producer.start();
//consumer.join();
//producer.join();
}
}
还有多个消费者和多个生产者的看这篇文章:【Java】生产者消费者模式的实现
其他控制线程的方法
方法 | 功能 |
---|---|
isAlive() | 判断线程是否终止 |
getPriority() | 获得线程优先级数值 |
setPriority() | 设置线程优先级数值(1—10) |
Thread.sleep() | 使当前线程睡眠指定毫秒 |
join() | 调用线程的该方法,将当前线程与该线程合并,即等待该线程结束再恢复当前线程的运行 |
yield | 让出CPU,当前线程进入就绪队列等待调度 |
wait() | 让当前线程等待 |
notify()/notifyAll() | 唤醒已经等待的(全部)线程 |
如果有错误或者高见还请指出,谢谢!