什么是单线程
什么是单线程:
在程序执行的过程中,如果执行只有一条,就是单线程程序
多线程:在程序执行过程中,如果执行路径有多条
什么是进程
进程:Process,qq.exe,这些客户端的集合
分配系统资源的基本单元,在执行过程中产生一个实例
什么是线程
线程:是进程的执行流,进程的某个任务
多线程的实现方式的3种步骤
实现多线程方式1:
1.自定义一个继承自Tread
2.重写Tread类中的run方法
3.在main方法中创建当前线程类对象,启动线程start()启动;
实现多线程方式2:
1.自定义一个类,实现Runnable接口
2.重写Runnable接口中的run方法
3.在main方法中创建资源类对象,创建Thread类对象将资源类对象作为参数传递,启动线程start();
实现多线程方式3:线程池
1.线程池:ExecutorService--->
工厂类Executors public static ExecutorService newFixedThreadPool(int nThread)
2.提交异步任务
submit(Callable<T> call)
3.关闭线程池
shutdown();
启动线程为什么是start而不是run方法
start()启动时通过jvm调用run方法,run方法调用只是普通方法
Java能够开启线程吗?
java不能够直接开启线程
线程对象:start()
start0():本地方法
线程Tread类中的相关常用方法
线程的优先级
setPrioity(int newPrioity);设置线程的优先级
getPrioity(int newPrioity):获取线程的优先级
最大10 默认5 最小1
优先级越大的线程抢占CPU的执行几率大
优先级越小的线程抢占CPU的执行几率小
join():等待线程终止
yield():暂停当前正在进行的线程,执行其他线程:"谦让"
sleep(long time)//线程睡眠(阻塞式方法):参数为毫秒
stop():已过时的方法,强迫线程停止执行
interrupt():中断线程的一种状态:打破了状态之后,继续执行程序
什么是守护线程,设置守护线程setDaemon(boolean flag)
在启动线程之前,调用这个方法才能设置为守护线程(注意事项)
(如果当前运行中线程都是守护线程,JVM退出)
获取主线程中名称
currentThread():表示正在运行的线程
setName()
getName()
面试题:sleep(long time)和wait()方法的区别
wait(long time):Object类中的方法(本地方法实现)
不同点:
1.是否立即释放锁
sleep(long time)方法调用,------等待休眠时间到了,计时等待,不会立即释放锁对象
释放的是一种锁状态
wait()----该方法调用会立即释放锁,然后后面才能使用锁对象调用唤醒对方线程
2.来源不同
sleep(long time):来源于Thread类
wait():来源于Object类,wait()和锁对象息息相关
共同点:
都会抛出中断异常,任何线程中断了当前线程的这种状态,就会产生中断异常
面试题:线程的生命周期?状态
State:线程的状态:是Thread类内部枚举
public enum State{
NEW,//线程新建状态
RUNNABLE,//线程运行状态
BLOCKED,//线程阻塞状态
WAITING,//死死等待
TIMED_WAITING,//超时等待,等待到一定时间,不等了
TERMINATED,//线程终止
}
线程的状态有几种?六种
public enum State{
NEW,//线程新建状态
RUNNABLE,//线程运行状态
BLOCKED,//线程阻塞状态
WAITING,//死死等待
TIMED_WAITING,//超时等待,等待到一定时间,不等了
TERMINATED,//线程终止
}
线程的实现方式2:接口:Runnable
多线程方式2的实现步骤:
1.自定义一个类,这个类实现接口:Runnable接口----用到了java设计模式的代理模式
2.重写Runnable接口中的run方法
3.在主线程中main
3.1创建当前资源类对象
3.2在创建Thread类对象,将3.2中的资源类对象作为参数进行传递
4.启动线程start方法启动
多线程实现方式2和方式1对比优势在哪里
方式1的实现:
内存角度:它不能体现出"数据共享"的概念
继承关系的弊端:局限性
方式2的实现:
优势:静态代理
能够体现出"资源共享"
同步机制(synchronized)
锁:可以是任意java类对象的(Object或者任意的子类)
锁对象:多个线程同一把锁
格式:
synchronize(锁对象){//门的开/关
多条语句对共享数据进行操作
}
锁对象:门的开关,多线程必须使用一个锁对象
检验多线程安全问题的标准是什么?
1.查看当前环境是否是多线程环境
2.当前程序中是否存在共享数据
3.是否有多条语句对共享数据进行操作
针对上面1.2.3哪一个解决
1.不能动
2.不能动,
3.可以解决,上锁
为了解决这个问题:java提供了一个关键字:synchronized
同步代码块
synchronize(锁对象){//门的开/关
多条语句对共享数据进行操作
}
什么是静态代理
代理角色:帮助真是角完成一些事情,对真实的功能进行增强
真实角色:专注于自己的事情
特点:真实角色和代理角色都需要实现接口
同步方法
如果一个方法是一个同步代码块,--------同步方法(非静态):将synchronize
锁对象是谁:
非静态的同步方法的锁对象:this--- 当前这个类的对象的地址值引用
静态的同步方法:
锁对象是谁:
静态的同步方法的锁对象跟反射有关系:当前类名.class
死锁一种现象-------如何解决
如果通用的方式:synchronized同步代码块/同步方法解决线程安全问题
但是可能会出现一种死锁
死锁:加入同步之后,两个或者两个以上的线程在互相抢占资源的时候出现一种互相等待的情况
解决方案:
多个线程并发的执行的时候,需要访问的资源是一个资源费对象
什么是同步机制,什么是等待唤醒机制
同步机制:
所有的多线程中资源冲突问题,都使用同步代码块/同步方法,
给当前对资源共享的数据上一道锁
格式:
synchronized(锁对象){
对象资源共享数据的操作
}
权限修饰符 synchronized 返回值类型 方法名(形参列表) {} :同步方法
NEW --- 未进入start
RUNNABLE --- 开启线程---运行状态
BLOCKED ---锁阻塞 某个线程被其他线程持有锁对象了之后进入阻塞
WATTING --一直等待 (唤醒:线程持有锁对象之后,如果他锁对象被是否,就可以唤醒对方线程)
TIMEED_WATTING ---超时等待:时间的限制 sleep(long time)
TERMINATED ---线程执行完毕,jvm 退出了
等待唤醒机制:
生产者消费者模式---信号法
生产者不断的产生数据,需要等待wait()消费者线程使用数据,
使用完毕之后,没有数据了,需要通知生产者线程产生数据(notify())
封装资源数据:Student
标记值:boolean flag; 默认false:没有数据,true:存在数据!
notify()和wait()为什么不定义在Thread类中呢而是Object类中
notify()和wait()----底层存在一种监视器(一种锁对象状态的变化) ----都是本地方法实现!
这个两个都是由锁对象来访问的,锁对象----可以任意Java类对象
wait()方法调用的时候,会立即释放锁
jdk5以后提供一种锁:可重入锁;Lock(JUC(包))
具体功能:
获取锁/释放锁
释放锁:unlock():
线程组:ThreadGroup
线程启动过程:start()-------将当前的线程添加到线程组中
将所有的线程添加线程组之后,线程执行完毕了,变成垃圾----回收
线程池(ExecutorService----Exeuctors的静态功能)
线程池:创建一个固定的可重用的线程数,当这些线程使用完毕终止了,它的(线程对象)不会被回收掉归还到线程池中,下次利用!
23种设计模式(思想)-------创建型设计模式中的一种"静态工厂方式的模式"
线程中的匿名内部类的方式
new 类名/接口名(){
重写方法
};
匿名内部类的本质:继承了该类或者实现了该接口子类的对象
Timer类:Java中定时器
构造方法:
public Timer()//构造一个新的定时器
成员方法:在一定时间执行一次任务(TimerTask)
每经过多少时间重复执行某个任务!
public cancel():终止定时器
//String文本格式---->Date日期格式
public void schedule(TimerTask task,Date time):
在指定日期时间内将执行这个任务!
public void schedule(TimerTask task,long delay)
public void schedule(TimerTask task,long delay,long period):
TimerTask:由定时器Timer来安排是执行一次/重复执行当前任务
在某个时间内执行这个任务,然后每经过period时间毫秒值后重复执行任务!
需求:
在今天18:00:00 删除某个目录(多级目录)里面所有的带.java文件的