黑马程序员_java基础day12

来源:互联网 发布:阿里云代金券申请 编辑:程序博客网 时间:2024/04/29 22:03

------- android培训、java培训、期待与您交流! ----------

主要内容:
一、线程间通信
    1,
其实就是多个线程在操作同一个资源,但是操作的动作不同。


    2,等待唤醒机制
       wait:
       notify();
       notifyAll();
       都使用在同步中,因为要对持有监控器(锁)的线程操作。
       所以要使用在同步中,因为只有同步才具有锁。


    3,为什么这些操作线程的方法要定义在Object类中呢?
        因为这些方法在操作同步中线程时,都必须要标识它们所操作线程持有的锁。
        只有同一个锁上的等待线程,可以被同一个锁上的notify唤醒。
        不可以对不同锁中的线程进行唤醒。


        也就是说,等待和唤醒必须是同一个锁。


        而锁可以是任意对象,所以可以被任意对象调用的方法定义Object类中。


    4,生产者消费者示例
    例:

/*生产者消费者示例*/class ProducerConsumerDemo {public static void main(String[] args) {Resource r = new Resource();Producer pro = new Producer(r);Consumer con = new Consumer(r);Thread t1 = new Thread(pro);Thread t2 = new Thread(pro);Thread t3 = new Thread(con);Thread t4 = new Thread(con);t1.start();t2.start();t3.start();t4.start();}}class Resource{private String name;private int count = 1;private boolean flag = false;public synchronized void set(String name){while(flag)try{this.wait();}catch(Exception e){}this.name = name+"--"+count++;System.out.println(Thread.currentThread().getName()+"...生产者..."+this.name);flag = true;this.notifyAll();}public synchronized void out(){while(!flag)try{wait();}catch(Exception e){}System.out.println(Thread.currentThread().getName()+"...消费者......."+this.name);flag = false;this.notifyAll();}}class Producer implements Runnable{private Resource res;Producer(Resource res){this.res = res;}public void run(){while (true){res.set("+商品+");}}}class Consumer implements Runnable{private Resource res;Consumer(Resource res){this.res = res;}public void run(){while (true){res.out();}}}

    5,停止线程
       stop方法已经过时。


       如何停止线程?
       只有一种,run方法结束。
       开启多线程运行,运行代码通常是循环结构。


       只有控制住循环,就可以让run方法结束,也就是线程结束。


       特殊情况:
       当线程处于了冻结状态。
       就不会读取到标记,那么线程就不会结束。


       当没有指定的方式让冻结的线程恢复到运行状态时,这时需要对冻结进行清除。
       强制让线程恢复到运行状态来,这样就可以操作标记让线程结束。


       Thread类提供该方法 interrupt();
       例:

class StopThread implements Runnable{private boolean flag = true;public synchronized void run(){while(flag){try{wait();}catch (InterruptedException e){System.out.println(Thread.currentThread().getName()+"...Exception");flag = false;}System.out.println(Thread.currentThread().getName()+"...run");}}public void changeFlag(){flag = false;}}class StopThreadDemo {public static void main(String[] args) {StopThread st = new StopThread();Thread t1 = new Thread(st);Thread t2 = new Thread(st);t1.start();t2.start();int num = 0;while(true){if(num++==60){t1.interrupt();t2.interrupt();st.changeFlag();break;}System.out.println(Thread.currentThread().getName()+"......."+num);}}}

    6,守护线程setDaemo(boolean on);
       将该线程标记为守护线程,当正在运行的线程都是守护线程时,Java虚拟机推出。
       该方法必须在启动线程前调用。
       t1.setDaemon(true);
       t2.setDaemon(true);
       t1.start();
       t2.start();


    7,join()方法(临时加入线程)
       当A线程执行到啊了B线程的.join()方法时,A就会等待,等B线程都执行完,A才会执行。


       join可以用来临时加入线程执行。
       t1.start();
       t1.join();
    
    8,线程toString()方法
       覆盖了父类中的toString()方法。
       返回该线程的字符串表示形式,包括线程名称,优先级和线程组。


    9,setPriority(int newPriority)
       setPriority()方法是用于设置线程的优先级的 。
       优先级共10个级别(1--10)。主线程和其他线程默认的优先级都是5


    10,yield()
        暂停当前正在执行的线程对象,并执行其他线程。
线程执行了yield()方法后,会暂停正在执行的这个线程对象,执行其他线程。

以达到平均分配的目的。


    11,JDK1.5中对于多线程操作的新特性。
        JDK1.5中提供了多线程解决方法。
        将同步synchronized替换成显示Lock操作。
        将Object中的wait,notify notifAll,替换成了Condition对象。
        Condition对象中的新方法:await();signal();signalAll();
该对象可以通过Lock锁 进行获取。
解锁语句unlock();一般放在finally语句中执行。
        该示例中,实现了本方唤醒对方操作。
例:

import java.util.concurrent.locks.*;class ProducerConsumerDemo2 {public static void main(String[] args) {Resource r = new Resource();Producer pro = new Producer(r);Consumer con = new Consumer(r);Thread t1 = new Thread(pro);Thread t2 = new Thread(pro);Thread t3 = new Thread(con);Thread t4 = new Thread(con);t1.start();t2.start();t3.start();t4.start();}}/*JDK1.5中提供了多线程解决方法。将同步synchronized替换成显示Lock操作。将Object中的wait,notify notifAll,替换成了Condition对象。该对象可以通过Lock锁 进行获取。该示例中,实现了本方唤醒对方操作。*/class Resource{private String name;private int count = 1;private boolean flag = false;private Lock lock = new ReentrantLock();private Condition condition_pro = lock.newCondition();private Condition condition_con = lock.newCondition();public  void set(String name)throws InterruptedException{lock.lock();try{while(flag)condition_pro.await();this.name = name+"--"+count++;System.out.println(Thread.currentThread().getName()+"...生产者..."+this.name);flag = true;condition_con.signal();}finally{lock.unlock();//释放锁的动作一定要执行}}public  void out()throws InterruptedException{lock.lock();try{while(!flag)condition_con.await();System.out.println(Thread.currentThread().getName()+"...消费者......."+this.name);flag = false;condition_pro.signal();}finally{lock.unlock();}}}class Producer implements Runnable{private Resource res;Producer(Resource res){this.res = res;}public void run(){while (true){try{res.set("+商品+");}catch (InterruptedException e){}}}}class Consumer implements Runnable{private Resource res;Consumer(Resource res){this.res = res;}public void run(){while (true){try{res.out();}catch (InterruptedException e){}}}}



原创粉丝点击