Java基础十八、十九和二十天合:多线程Thread+Runnable+同步锁+设计模式+注解+反射+socket/网络编程/内部类

多线程

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.特点

内部类可以直接使用外部类的成员(方法/变量)

外部类想要使用内部类的资源必须创建对象

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值