黑马程序员————多线程单例设计模式线程间通信,JDK1.5互斥锁
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了黑马程序员————多线程单例设计模式线程间通信,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互斥锁的主要内容,如果未能解决你的问题,请参考以下文章