在单个程序中同时运行多个Thread完成不同的工作,称为多线程,它让众多编程人员又爱又恨,它的好处可以同时处理同一事件,让占据时间长的任务在后台运行,可以释放资源内存,但也存在缺点,用多了会造成死锁,程序性能变差,不好控制。
讲了这么多,现在切入主题,在我们的日常生活中,线程同步用处比比皆是,例如:街道上红绿灯,银行的存钱取钱等。现在我们就来看看同步线程的生产者消费者的例子吧。看如下代码:
package product;
import java.util.concurrent.locks.Lock;
public class Factory {
static int j = 0;
public static void main(String[] args) {
// new内部类,需实例化一个factory对象
Factory factory = new Factory();
Object lock = new Object();
ProductThread productThread = factory.new ProductThread(lock);
productThread.setName("ProductThread");
productThread.start();
CustomeThread customeThread = factory.new CustomeThread(lock);
customeThread.setName("CustomeThread");
customeThread.start();
}
// 生产者
class ProductThread extends Thread {
Object lock;
public ProductThread(Object lock) {
super();
this.lock = lock;
}
public void run() {
synchronized (lock) {
for (int i = 0; i < 10; i++) {
j++;
System.out.println("j(" + Thread.currentThread().getName()
+ ")" + "=" + j);
lock.notify();
try {
lock.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
// 消费者
class CustomeThread extends Thread {
Object lock;
public CustomeThread(Object lock) {
super();
this.lock = lock;
}
public void run() {
synchronized (lock) {
for (int i = 0; i < 10; i++) {
j--;
System.out.println("j(" + Thread.currentThread().getName()
+ ")" + "=" + j);
lock.notify();
try {
lock.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
}