黑马程序员技术交流社区

标题: File\线程\Lambda\单例\异常\同步\线程的状态 [打印本页]

作者: zeroHe    时间: 2018-11-21 14:48
标题: File\线程\Lambda\单例\异常\同步\线程的状态
java.io.File
    //路径分隔符
    //C:\ProgramData + File.pathSeparator + C:\Java
    //File.pathSeparator windows:分号 ; linux:冒号:

    //文件名称分隔符
    //C: + File.separator + ProgramData
    //File.separator windows:反斜杠\ linux:正斜杠

    反斜杠\ 为特殊字符,需要进行转义 \\

    public long length():
    文件不存在/文件大小为0,返回0,否则返回文件大小的字节数

路径
    绝对路径
    相对路径

递归

FileFilter
FilenameFileter


等待唤醒机制
    wait
    notify
    notifyAll
        wait 和 notify 必须由同一个锁对象调用

线程池
    ExecutorService threadPool = Executors.newFixedThreadPool(threadNum);
    threadPool.execute(Runnable r);
    threadPool.submit(Runnable r);
    threadPool.shutdown();

Lambda
    01 () -> {}
    new Thread(
    () -> { System.out.println("hello Lambda"); }
    ).start();
    //Runnable run 无参数无返回值

    02 使用条件:接口类型,只有一个抽象方法

    03
@FunctionalInterface
public interface MyFunctionalInterface {
    public abstract int sum(int a,int b);
}

public class MyFunctionalInterfaceTest {
    public static void main(String[] args) {
        int sum = invokeSum(11,22,(a,b) -> (a+b) );
        System.out.println(sum);
    }
    public static  int invokeSum(int a1,int b1,MyFunctionalInterface functionalInterface){
        return functionalInterface.sum(a1,b1);
    }
}
    //有参数 有返回值 FunctionalInterface注解:编译器判断接口是否只有一个抽象方法(接口是否为函数式接口)

    04
        Arrays.sort(arr,(Person p1,Person p2) -> {
            return  p1.getAge() - p2.getAge();
        });

        Arrays.sort(arr,(p1,p2) -> (p1.getAge() - p2.getAge()));

    a.小括号中的类型可以省略
    b.小括号中有且仅有一个参数,小括号可以省略
    c.大括号中有且仅有一个语句,无论是否有返回值,都可以省略大括号、return关键字、分号

单例模式
    01 懒汉模式 singleton = null
    //效率高、存在线程安全问题
    02 饿汉模式 singleton = new Singeton()

Callable 实现线程



异常 (异常类创建对象并抛出)
    java.lang.Throwable
        java.lang.Error

        java.lang.Eexception
             java.lang.RuntimeException 运行时异常 例如 ArrayIndexOutOfBoundsException
             其他类型 编译期异常 例如 IOException
异常的处理
    throws
        01 如果是运行时异常,默认就会抛出
        02 如果是编译期异常,则会抛出
    try{ }catch(Exception e){ }
        如果代码块可能抛出多个异常,可以:
            1 多个 try..catch
            2 一个try,多个catch
            3 一个try,一个catch 用异常的父类接收

自定义异常 无参构造、有参构造
    编译期异常 (extends Exception)
    运行期异常 (extends RuntimeException)

子父类方法
    父类没有抛出异常
        子类可以抛出运行时异常
        子类不可以抛出编译器异常(必须 try..catch )
    父类抛出异常
        子类抛出的异常必须为父类抛出的异常的子类型


线程//并发编程网
    并发:一个时间段内发生
    并行:一个时间点发生

    进程:一个正在运行的程序
    线程:进程中的一个执行单元

开启线程的方式一
   继承Thread,复写run方法,实例化对象,调用start方法

开启线程的方式二
   新建一个类实现Runnable接口,实现run方法,实例化该类 r,new Thread(r).start();

实现 Runnable 接口的好处:
    避免单根继承的局限性
    增强程序的扩展性,降低程序的耦合性

new Thread(new Runnable(){
    public void run(){ System.out.println("r"); }
}){
    public void run(){ System.out.println("t"); }
}.start();
//运行结果:t
//Thread 默认的 run 方法 是 调用 Runnable 的 run
//但是被 重写了,所以打印 t


同步
    线程安全问题:多线程+共享变量

同步代码块:
    synchronized(lockObj){}
    // "" this Thread.class
同步方法
    修饰符上 加上 synchronized
    默认的锁对象
        01 非静态同步方法 :this
        02 静态同步方法 :类名.class

Lock锁
   Lock lock = new ReentrantLock();
   lock.lock();
   //todoCode
   lock.unlock();

   推荐写法:
   try{
   lock.lock();
   //todoCode   
   }【catch(){}】finally{
   lock.unlock();
   }

线程的状态
NEW 新建状态
RUNNABLE 可运行状态
BLOCKED 锁阻塞状态
WAITING
TIMED_WAITING 即使等待 Thread.sleep(long)/ 锁对象.wait(long)
TREMINATED 终结状态

notify() 将同一个同步中,同一个锁对象下的被等待的线程唤醒






欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2