Lock锁 也可以解决票出现0票的问题
清晰的表示加锁和释放锁
ReentrantLock lock();unlock();
死锁现象 两个或者两个以上的线程,在抢占CPU的执行权的时候,都处于等待状态
停止不动
代码要求会写
Interface MyLock{
private static final Object objA=new Object();
private static final Object objB=new Object();}
class MyThread{
priavate boolean flag;
public MyThread(boolean flag){
this.flag = flag ;
}//crtl+shift+s+o
if(flag){
synchronized(MyLock.ObjA){System.out.println("ObjA..true");
synchronized(MyLock.ObjB){System.out.println("ObjB..true");}else{
synchronized(MyLock.ObjB){System.out.println("ObjB..false")
synchronized(MyLock.ObjA){System.out.println("ObjA..false")}}}}
}
线程池
指定数量的线程
使用步骤
获取线程池
Executors这个类中方法:
public static ExecutorService newCachedThreadPool(): 根据任务的数量来创建线程对应的线程个数
public static ExecutorService newFixedThreadPool(int nThreads): 固定初始化几个线程
public static ExecutorService newSingleThreadExecutor(): 初始化一个线程的线程池
提交任务
ExecutorService 中的方法: submit(Runnable task)
停止线程池
void shutdown()
面试题===========
多线程有几种实现方案,分别是哪几种?两种
第一种: 自定义一个类,然后该类继承Thread类
第二种: 自定义一个类,然后让该类实现Runnable接口
同步有几种方式,分别是什么?2种:
第一种: 使用同步代码块
第二种: 同步方法
启动一个线程是run()还是start()?它们的区别?
如果我们调用run方法,那么就是把该方法作为普通的方法执行
而我们调用start方法,其实是通知jvm开启一个线程去执行run方法
定时器
Timer 用于Java线程指定时间或周期运行任务
使用步骤
创建对象
执行任务
设计模式:经验的总结 分类:创建对象 行为功能 结构组成
思考设计问题的方法,被反复使用,多数人知晓的,经过分类编目的,代码设计经验的总结。
作用:可重用代码,更易被理解,保证可靠性,结构清晰
分类:
创建 创建对象 单例,抽象工厂,建造者,工厂,原型。
行为 对象功能 适配器,桥接,装饰,组合,外观,享元,代理。
结构 对象组成 模版方法,命令,迭代器,观察者,、中介者,备忘录,解释器,状态,策略,职责链,访问者。
简单工厂
定义一个具体的工厂类
抽象工厂
定义一个抽象类的接口,对象创建由继承抽象工厂的具体类实现
单例
保证类在内存中只有一个对象,节省内存
实现:方法私有 提供一个对象和公共访问方式
饿汉式和懒汉式的区别:回到家很饿,立刻做饭吃(饿汉式) 先休息一会(懒汉式)
面试懒汉:线程安全+synchronized 对象等调用方法时才加载(延迟加载)
开发饿汉
两种思想 线程安全和延迟加载
模板
定义一个算法的骨架,具体的算法由子类实现
装饰者
使用被装饰类的一个子类的实例(装饰类),相当于继承
手机听音乐,天气预报
观察者
猎头headhunter
清晰的表示加锁和释放锁
ReentrantLock lock();unlock();
死锁现象 两个或者两个以上的线程,在抢占CPU的执行权的时候,都处于等待状态
停止不动
代码要求会写
Interface MyLock{
private static final Object objA=new Object();
private static final Object objB=new Object();}
class MyThread{
priavate boolean flag;
public MyThread(boolean flag){
this.flag = flag ;
}//crtl+shift+s+o
if(flag){
synchronized(MyLock.ObjA){System.out.println("ObjA..true");
synchronized(MyLock.ObjB){System.out.println("ObjB..true");}else{
synchronized(MyLock.ObjB){System.out.println("ObjB..false")
synchronized(MyLock.ObjA){System.out.println("ObjA..false")}}}}
}
线程池
指定数量的线程
使用步骤
获取线程池
Executors这个类中方法:
public static ExecutorService newCachedThreadPool(): 根据任务的数量来创建线程对应的线程个数
public static ExecutorService newFixedThreadPool(int nThreads): 固定初始化几个线程
public static ExecutorService newSingleThreadExecutor(): 初始化一个线程的线程池
提交任务
ExecutorService 中的方法: submit(Runnable task)
停止线程池
void shutdown()
面试题===========
多线程有几种实现方案,分别是哪几种?两种
第一种: 自定义一个类,然后该类继承Thread类
第二种: 自定义一个类,然后让该类实现Runnable接口
同步有几种方式,分别是什么?2种:
第一种: 使用同步代码块
第二种: 同步方法
启动一个线程是run()还是start()?它们的区别?
如果我们调用run方法,那么就是把该方法作为普通的方法执行
而我们调用start方法,其实是通知jvm开启一个线程去执行run方法
定时器
Timer 用于Java线程指定时间或周期运行任务
使用步骤
创建对象
执行任务
设计模式:经验的总结 分类:创建对象 行为功能 结构组成
思考设计问题的方法,被反复使用,多数人知晓的,经过分类编目的,代码设计经验的总结。
作用:可重用代码,更易被理解,保证可靠性,结构清晰
分类:
创建 创建对象 单例,抽象工厂,建造者,工厂,原型。
行为 对象功能 适配器,桥接,装饰,组合,外观,享元,代理。
结构 对象组成 模版方法,命令,迭代器,观察者,、中介者,备忘录,解释器,状态,策略,职责链,访问者。
简单工厂
定义一个具体的工厂类
抽象工厂
定义一个抽象类的接口,对象创建由继承抽象工厂的具体类实现
单例
保证类在内存中只有一个对象,节省内存
实现:方法私有 提供一个对象和公共访问方式
饿汉式和懒汉式的区别:回到家很饿,立刻做饭吃(饿汉式) 先休息一会(懒汉式)
面试懒汉:线程安全+synchronized 对象等调用方法时才加载(延迟加载)
开发饿汉
两种思想 线程安全和延迟加载
模板
定义一个算法的骨架,具体的算法由子类实现
装饰者
使用被装饰类的一个子类的实例(装饰类),相当于继承
手机听音乐,天气预报
观察者
猎头headhunter