学习java第二十二天
线程
wait()线程睡眠
notify()单个线程唤醒,唤醒当前对象
notifyAll()唤醒所有线程
上面都是Object方法,因为进行锁时要锁对象,Object是最大的父类,锁其他对象类也是Object的子类
wait() 和 sleep():
sleep一段时间内会释放锁
wait()可以一段时间释放,也可以永远不释放
notify() 与notifyAll()
notify 会唤醒对象,如果存在多个对象,会交替唤醒对象
notifyAll() 唤醒所有对象
线程的生命周期:
生产者和消费者模式:避免资源的浪费
生产者与消费者属于互斥锁,只能有一个线程在执行
1.使用构造来解决这个锁的是不是同一个对象的问题
需要用到以下状态:
produce.notify();
produce.notifyAll();
produce.wait();
死锁:两个线程都互相谦让。等待对方执行。或者互相都不让,占用着各自的资源不放。
关键字 volatile:表示数据的可见性,线程1的值改变后立刻告诉线程2
public static volatile 数据类型 名称;
线程池:
没有使用线程池之前需要来创建线程,用完之后要进行销毁,消耗性能
线程池就是对线程进行管理,也就是一个容器
Executors(线程工具类):线程池工具类
Callable(接口):结果类型,实现者需要定义了一个不带任何参数的 call 方法。
Future(接口):返回线程异步计算的结果
使用步骤:
ExecutorService 对象名 =Executors.newFixedThreadPool(10);//得到线程池对象
Future f =对象名.submit(new Gobackimpl(10));//提交任务
//提交一个 Runnable 任务用于执行完成后返回null,
//提交一个返回值的任务Callable< T >用于执行,返回一个表示任务的未决结果的 Future。
//该 Future 的 get 方法在成功完成时将会返回该任务的结果。
对象名.shutdown(); //关闭任务
java.util
类 Timer:定时操作类。
一种工具,线程用其安排以后在后台线程中执行的任务。可安排任务执行一次,或者定期重复执行。
public void schedule(TimerTask task, long delay)安排在指定延迟后执行指定的任务。
参数:task - 所要安排的任务。delay - 执行任务前的延迟时间,单位是毫秒。
public void schedule(TimerTask task, Date firstTime, long period)
参数:task - 所要安排的任务。firstTime - 首次执行任务的时间。period - 执行各后续任务之间的时间间隔,单位是毫秒。
java.util
类 TimerTask(抽象类)
是实现定时操作的任务对象,由 Timer 安排为一次执行或重复执行的任务。
设计模式:按照某些好的经验完成框架
单例设计:有且仅加载一个类,静态的也可以有且仅加载一次(问题较多)
工具类大部分都是单例设计的。
注:
私有的属性
私有的构造
公有的方法
第一种(饿汉):类加载就创建时对象
第二种(懒汉):类加载时不同时创建对象,需要时且判断到对象为空时才创建对象,
第三种(老汉):在饿汉模式实例化对象时加上finally
双重锁:锁方法,锁对象 :
public class 类名{
// 私有的属性
private static 类名 对象名;
// 私有的构造
private 类名(){
}
// 提供共有的方法
public synchronized static 类名 getInstance(){
if(对象名 ==null){
//锁class 文件,防止高并发里遇到实例化两个对象,锁class文件
synchronized (类名.class){
if(对象名 == null){
对象名 = new 类名();
}
}
}
return 对象名;
}
}
工厂模式:
简单工厂者模式:生产对象 ==> 就是多态的一种体现
第二种: 使用接口来进行规范标准约束,生产对象
体现形式: (多态的形式)
1.以父类作为返回值 简单工厂者
2.以父类作为参数
枚举:enum:(抽象类)
创建枚举类型要使用 enum 关键字,隐含了所创建的类型都是java.lang.Enum 类的子类
枚举类里的常量都大写
和switch搭配一起使用
常规方法:
public final String name()返回此枚举常量的名称,在其枚举声明中对其进行声明。
public String toString()返回枚举常量的名称,它包含在声明中。
优先考虑使用 toString() 方法。
总结:今天这个学习内容不得不说是很杂很多,从线程池到生产者消费者理解到工厂模式到枚举。有些类都还没有怎么看过就过了,需要好好记。