/*
守护线程
*/
// 启动线程之前,将线程设置为守护线程
t.setDaemon(true);
// 即使是死循环,但由于该线程是守护者,当用户线程结束,守护线程自动终止。
1.4、关于object类中的wait和notify方法。(生产者和消费者模式!)
第一:wait和notify方法不是线程对象的方法,是java中任何一个java对象都有的方法,因为这两个方式是Object类中自带的。
wait方法和notify方法不是通过线程对象调用,
不是这样的:t.wait(),也不是这样的:t.notify()..不对。
第二:wait()方法作用?
Object o = new Object();
o.wait();
表示:
让正在。对象上活动的线程进入等待状态,无期限等待,直到被唤醒为止
o.wait();方法的调用,会让"当前线程(正在o对象上活动的线程)”进入等待状态。
第三:notify()方法作用?
Object o = new Object();
o.notify();
表示:
唤醒正在。对象上等待的线程。
还有一个notifyA来了()方法:
这个方法是唤醒。对象上处于等待的所有线程.
package com.cn.oc.thred;
import java.util.ArrayList;
import java.util.List;
public class ThreadTest16 {
public static void main(String[] args) {
//创建1个仓库对象
List list = new ArrayList();
//创建生产者线程
Thread t1 = new Thread(new Producer(list));
//创建消费者线程
Thread t2 = new Thread(new Consumer(list));
t1.setName("生产者线程");
t2.setName("消费者线程");
//线程启动
t1.start();
t2.start();
}
}
//生产线程
class Producer implements Runnable {
private List list;
public Producer(List list){
this.list = list;
}
@Override
public void run() {
//一直生产
while (true) {
synchronized(list){
if(list.size()>0){
try {//当前线程等待,释放锁
list.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//进行生产
//添加元素
Object obj = new Object();
list.add(obj);
System.out.println(Thread.currentThread().getName()+"------>"+obj);
//唤醒消费者
list.notifyAll();
}
}
}
}
//消费线程
class Consumer implements Runnable{
private List list;
public Consumer(List list){
this.list = list;
}
@Override
public void run() {
//一直消费
while(true){
synchronized (list){
if(list.size() == 0){
try {
list.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//进行消费
Object obj = list.remove(0);
System.out.println(Thread.currentThread().getName()+"------>"+obj);
//唤醒生产者线程
list.notifyAll();
}
}
}
}