【黑马】程序员————多线程(二)单例设计模式、线程间通信,JDK1.5互斥锁

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流!-----

一、单例设计模式

单例设计模式的意义:

A.保证类在内存中只有一个对象,不提供外部访问方式,构造函数用private修饰。

B.提供公共方法(static修饰,类的静态方法),获取类的实例。单例设计模式分为饿汉和懒汉两种模式。

饿汉式&懒汉式

class Test33 {
    
    public static void main(String[] args) {
        
        Fanjianan.getInstance();
        
        
    }
    
}

class Fanjianan {
    private Fanjianan() {
        
    }
    //创建静态私有对象
    private static Fanjianan fjn = new Fanjianan();
    
    //提供公共访问方法获取对象实例
    public static Fanjianan getInstance() {
        return fjn;
    }
    /*懒汉式,懒得new,要用的时候再new
    private static Fanjianan fjn;
    public static Fanjianan getInstance() {
        if(fjn == null)
            fjn = new Fanjianan();
        return fjn;
    }
    */
}

 

单例类举例:

Runtime类  

Runtime r = Rutime.getRuntime();

r.exec("shutdown -s -t 300"); //300秒后关机

r.exec("shutdown -a");  //取消关机

Timer类,计时器

import java.util.*;

    public class Test33{
        /**
         * @param args
         * 计时器
         * @throws InterruptedException 
         */
        public static void main(String[] args) throws InterruptedException {
            Timer t = new Timer();
            t.schedule(new MyTimerTask(), 0,3000);

            while(true) {
                System.out.println(new Date());
                Thread.sleep(1000);
            }
        }
    }
    class MyTimerTask extends TimerTask {
        @Override
        public void run() {
            System.out.println("起床背英语单词");
        }

    }

 

 

二、线程通信

线程间通信原理:

1、多个线程并发执行,默认情况下CPU随机切换线程。如果希望有规律的执行,可以使用通信手段。

2、wait()方法和notify()方法暂停、唤醒线程。两个方法必须在同步代码中执行,并且使用同步锁对象调用。

3.3个以上多线程通信,notify()随机唤醒线程,notifyAll()唤醒所有线程。while判断条件

/*生产者消费者
 * 示  例
 */

public class Test33 {
    public static void main(String[] args) {
        
        
        
        Goods goods = new Goods();
        Thread t1 = new Thread(new Producer(goods));
        Thread t2 = new Thread(new SalesMan(goods));
        Thread t3 = new Thread(new Producer(goods));
        
        
        t1.start();t2.start();t3.start();
        
    }
}


class Goods {  //货物类,id和型号
    
    private int id = 0;
    private String mode;
    private boolean flag = false;
    
    
    public synchronized void setGoods(String mode) {  //生产方法
        
        if(flag) {
            try {
                wait();
            } catch (InterruptedException e) {
                                e.printStackTrace();
            }
        }
        
        
        this.mode = mode;
        
        System.out.println(Thread.currentThread().getName()+"....生产了。。。商品:"+ ++id+"。。。"+mode );
        flag = true;
        
        notifyAll();  //唤醒出售线程
        
    }
    
    public synchronized void saleGoods() {
        
        if(!flag) {
            try {
                wait();
            } catch (InterruptedException e) {
                                e.printStackTrace();
            }
        }
        
        
        
        System.out.println(Thread.currentThread().getName()+"....售出了。。。商品:"+this.id+"。。。"+mode );
        flag = false;
        
        notifyAll();
        
    }
    
}

class Producer implements Runnable { //生产者线程
    
    private Goods goods;
    Producer(Goods goods) {
        this.goods = goods;
    }
    
    public void run() {
        
        for(int i = 0;i<200;i++) {
            goods.setGoods("本田SCR-V");
        }
            
    }
}

class SalesMan implements Runnable {
    
    private Goods goods;
    
    
    SalesMan(Goods goods) {
        this.goods = goods;
    }
    public void run() {
        
        while(true) {
            goods.saleGoods();
        }
            
    }
}

 

三、JDK1.5互斥锁

你可能感兴趣的:(【黑马】程序员————多线程(二)单例设计模式、线程间通信,JDK1.5互斥锁)