多线程
1.概述
为了提高程序的运行效率
2.进程和线程
进程:是指正在运行的程序
线程:是指进程的实际运行单位,也是直接被操作系统调度
一个软件的运行依赖一个或者多个进程,一个进程包含一个或者多个线程
3.并行和并发
并行:是多个CPU,对应多个程序,每个CPU执行一个程序,不用抢
并发:是多个程序抢占CPU的执行权
效率:并发 > 并行
4.模拟多线程编程方式
继承Thread:好处是可以使用父类的所有功能,坏处是单继承/强耦合
实现Runnable接口:好处是解耦合,可以多继承多实现
Thread
1.概述
线程是程序中的执行线程。Java 虚拟机允许应用程序并发地运行多个执行线程。
2.创建对象
**Thread**() 分配新的 Thread 对象。 |
---|
**Thread**(Runnable target) 分配新的 Thread 对象。 |
**Thread**(Runnable target, String name) 分配新的 Thread 对象。 |
**Thread**(String name) 分配新的 Thread 对象。 |
3.常用方法
long | **getId**() 返回该线程的标识符。 |
void | **setName**(String name) 改变线程名称,使之与参数 name 相同。 |
String | **getName**() 返回该线程的名称。 |
static void | **sleep**(long millis) 在指定的毫秒数内让当前正在执行的线程休眠(暂停执行),此操作受到系统计时器和调度程序精度和准确性的影响。 |
void | **stop**() |
void | **start**() 使该线程开始执行;Java 虚拟机调用该线程的 run 方法。 |
void | **run**() 如果该线程是使用独立的 Runnable 运行对象构造的,则调用该 Runnable 对象的 run 方法;否则,该方法不执行任何操作并返回。 |
static Thread | **currentThread**() 返回对当前正在执行的线程对象的引用。 |
Runnable接口
1.概述
Runnable接口应该由那些打算通过某一线程执行其实例的类来实现。
2.常用方法
void | **run**() |
---|---|
继承Thread和实现Runnable接口
1.继承Thread
好处:方法多,创建对象的方式多
坏处:强耦合,程序设计理念相对不灵活
2.实现Runnable接口
好处:松耦合,方便程序设计,因为接口可以多继承多实现,还能继承时多实现
坏处:方法少只有一个run(),也不能new
同步锁
同步:
是指没钥匙的人只能排队等待的过程
锁:
是指把共享资源加锁
同步和异步:
同步:是指排队等待的现象
异步:是指不排队发生了抢的现象
效率:异步 > 同步
安全性:同步 > 异步
用法:
使用关键字实现锁 synchronized
用在方法上-----自动分配锁对象this 静态数据需指定锁对象–类名.class
synchronized public void eat(){}
用在代码块上
synchronized(锁对象){有问题的代码}
设计模式
1.概述
2.单例模式
保证一个类仅有一个实例,并提供一个访问它的全局访问点
饿汉式:
//TODO 创建类---保证一个类仅有一个实例
class MySingle{
//1.私有构造方法
private MySingle(){}
//2,自己new
//加static 是因为,被静态方法get()调用的资源也必须是静态的
static private MySingle my=new MySingle();
//3.给外界提供一个get(),把my返回
public static MySingle get(){
return my;
}
}
懒汉式:
//TODO 懒汉式 --- 延迟加载/按需加载+线程安全问题
//在多线程并发操作时,数据到底是否存在线程安全的隐患?
//有没有隐患看---共享数据有没有被多条语句操作
class MySingle2 {
private MySingle2() {
}
//1.懒汉式,不会第一时间把对象创建出来占用内存
static private MySingle2 my;
//3.解决共享资源的线程安全隐患--加锁
//如果锁的是普通资源,锁对象可以任意,只要是同一个就可以
//如果锁的是静态资源,锁对象必须是,类名.class
//4.静态方法的锁对象,分配的是---类名.class
public synchronized static MySingle2 get() {
//2.懒汉式,在执行get()时才开始创建对象
if (my == null) {
my = new MySingle2();
}
return my;
}
}
注解
分类
JDK注解
@Override
@Deprecated标记就表明这个方法已经过时了但我就要用别提示我过期不常用
@SuppressWarnings(“deprecation”) 忽略警告,不常用
@SafeVarargs jdk1.7出现,堆污染,不常用
@FunctionallInterface jdk1.8出现,配合函数式编程拉姆达表达式,不常用
元注解—描述注解的注解
@Target 注解用在哪里:类上、方法上、属性上
@Retention 注解的生命周期:源文件中、class文件中、运行中
@Inherited 允许子注解继承
@Documented 生成javadoc时会包含注解,不常用
@Repeatable注解为可重复类型注解,可以在同一个地方多次使用,不常用
自定义注解
元注解
配合完成自定义注解
@Target
指定注解可以出现的位置
ElementType工具类维护了具体的值
@Retention
指定注解的生命周期
RetentionPolicy工具类维护了具体的值-------源码中,class文件中,运行时
自定义注解
//第一大步:自定义注解--由底层框架完成
@Target({ElementType.TYPE,ElementType.PARAMETER})//1.指定注解可以出现的位置
@Retention(RetentionPolicy.SOURCE)//2.指定注解的生命周期
@interface Controller {
// String local();//3.添加属性
String local() default "";//4.给属性设置默认值
}
//第二大步:使用注解
//@Controller 1、直接使用
//@Controller(local="Hello类")2、用时给local属性指定值
@Controller
class hell{
//@Controller---位置不对
String name;
//@Controller---//---位置不对
public void eat(@Controller(local = "参数上") int a){
System.out.println("hello");
}
}
反射
1.概述
主要是底层在用,因为底层只能获取.class文件,借助反射的技术,解析.class文件里的所有内容,并把所有数据封装在工具类Class身上。
2.Class工具类
1.创建对象
Class.forName(“类的全路径”);
类名.class
对象.getClass();
2.常用方法
获得包名、类名
getPackage().getName() | 获取包名 |
---|---|
getSimpleName() | 获取类名 |
getName() | 获取全路径名 |
解析.class文件里的构造方法
getConstructor | 获得公开的构造方法 |
---|---|
getConstructors | 获得公开的构造方法们 |
getDeclaredConstructors() | 获得所有构造方法们,包括私有的 |
getDeclaredConstructor | 获得构造方法,包括私有的 |
解析.class文件里的成员变量
getField() | 获得公开的成员变量 |
---|---|
getFields() | 获得所有公开的成员变量,包括继承的变量 |
getDeclaredFields() | 获得所有的成员变量,包括私有,不包括继承的变量 |
getDeclaredField() | 获得成员变量,包括私有,不包括继承的变量 |
解析.class文件里的成员方法
getMethods() | 获得所有的公共方法们 |
---|---|
getMethod() | 获得公共方法 |
getDeclaredMethods() | 获得本类定义的所有方法们,包括私有,不包括继承的方法 |
getDeclaredMethod() | 获得本类定义的方法,包括私有,不包括继承的方法 |
通过反射创建对象
newInstance() newInstance()底层访问了无参构造(不能是private)
3.暴力反射
专门反射私有的数据,包括公开的和默认的,都可以反射到,应用的更多,要用对API。
socket/网络编程
1.概述
2.工具类
服务器端:ServerSocket
创建对象
ServerSocket(int port)
常用方法
Socket accept() 侦听并接受到此套接字的连接
客户端:Socket
创建对象
Socket(String host,int port)
常用方法
void close() 关闭此套接字
InputStream getInputStream() 返回此套接字的输入流
OutPutStream getOutPutStream() 返回此套接字的输出流
内部类
1.语法
class A{//外部类
class B{//内部类
}
}
2.特点
内部类可以直接使用外部类的成员(方法/变量)
外部类想要使用内部类的资源必须创建对象