/*
守护线程
*/
// 启动线程之前,将线程设置为守护线程
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(); } } } }