首页 > 编程语言 >部分Java基础进阶内容 - 随笔

部分Java基础进阶内容 - 随笔

时间:2022-10-12 22:46:11浏览次数:34  
标签:Java 进阶 System 线程 println new 随笔 pool out

JAVA进阶

对象序列化

对象要序列化要实现Serializable接口

然后通过ObjectInputStream 对象读入流来读入一个对象

new ObjectOutputStream(new xxOutputStream(""))
new的时候传入一个读入流

需要申明一个序列化版本号

private static final long serialVersionUID = ;
//用于协商该类的版本,序列化和反序列的版本号不一致时,会异常。修订后应该修改版本号,这样之前序列化的对象进行反序列的时候会失败,抛异常。
//序列化对象
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(""));
//写入
oos.writeObject();


ObjectInputStream ois = new ObjectInputStream(new FileInputStream(""));
//读进
Object o = ois.readObject();

打印流

类:PrintStream

image-20220814203600118

改变输出语句到文件

 PrintStream printStream = new PrintStream("2.txt");
        System.out.println("1111");
        System.out.println("1111");
        System.setOut(printStream);
        System.out.println("2222");
        System.out.println(2222);

Properties

案例

//写配置文件
Properties properties = new Properties();
properties.setProperty("admin","123456");


//参数一 保存管道,字符输出流管道,  参数二  保存的注解
properties.store(new FileWriter("123.properties"),"");

//加载配置文件
properties.load(new FileInputStream("123.properties"));

String admin = properties.getProperty("admin");
System.out.println(admin);

commons-io

封装了常用的IO操作类库 , 提高开发效率

导入依赖

<dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>2.11.0</version>
</dependency>

FileUtils作用

image-20220814234424742

常用工具类

FileUtils
IOUtils

线程

thread - 一个程序内部的一条执行路径

main方法的执行就是一条单独的执行路径

三种方式创建多线程

1.继承Thread类

便于构建, 只需要重写run方法, 但是已经继承了一个类了 ,不利于拓展

样例
public class ThreadDemo1 {
    public static void main(String[] args) {
        Thread t = new MyThread();

        //调用start方法启用线程
        t.start();
        for (int i = 0; i < 5; i++) {
            System.out.println("主线程"+i);
        }
    }
}

class MyThread extends Thread{
    /**
     * 重写run方法
     */
    @Override
    public void run() {
        for (int i = 0; i < 5; i++) {
            System.out.println("子线程"+i);
        }
    }
}

2.实现Runnable接口

样例
public class ThreadDemo2 {
    public static void main(String[] args) {
        //任务对象
        Runnable target = new MyRunnable();
        //任务交给Thread处理
        Thread t = new Thread(target);

        t.start();

        for (int i = 0; i < 5; i++) {
            System.out.println("主线程"+i);
        }
    }
}

class MyRunnable implements Runnable{

    @Override
    public void run() {
        for (int i = 0; i < 5; i++) {
            System.out.println("子线程"+i);
        }
    }
}
使用匿名类实现
     new Thread(){
            @Override
            public void run() {
                for (int i = 0; i < 5; i++) {
                    System.out.println("子1线程"+i);
                }
            }
        }.start();
//使用Runnable
    new Thread(new Runnable() {
            @Override
            public void run() {
                for (int i = 0; i < 5; i++) {
                    System.out.println("子2线程"+i);
                }
            }
        }).start();
使用Lambada表达式优化
//条件:需要代替的类是一个接口,且有且仅有一个需要被替代的方法,仅有一个参数省去小括号,仅有一条语句省去大括号        
new Thread(()->{
            for (int i = 0; i < 5; i++) {
                System.out.println("子3线程"+i);
            }
        }).start();

3.实现Callable接口 , 结合FutureTask

优点-可以获取返回值

样例
public class ThreadDemo3 {
    public static void main(String[] args) {
        Callable<String> call = new MyCallable(3);

        FutureTask<String> f1 = new FutureTask<>(call);
        Thread t1 = new Thread(f1);
        t1.start();
        String s = null;
        try {
            //线程执行完毕,才会提取结果
            s = f1.get();
            System.out.println(s);
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        }
        System.out.println("...");
    }
}

class MyCallable implements Callable<String>{
    private int n;

    public MyCallable(int n) {
        this.n = n;
    }


    @Override
    public String call() throws Exception {
//        System.out.println(Thread.getAllStackTraces());
//        System.out.println(Thread.activeCount());
//        System.out.println(Thread.currentThread().getName());
//        Thread.sleep(5000);
        return String.valueOf(n+1);
    }
}

三种方式对比

image-20220815224712603

Thread常用方法

sleep - 静态方法

Thread.currentThread() - 获取当前线程

image-20221009232427303

加锁

同步代码块 - - synchronized

解决线程同步问题 - 线程安全

idea中 - 选中代码块 快捷键: Ctrl + Alt + T

将代码块放到同步代码块里

       synchronized ("hhh") {
            System.out.println("aaa");
            System.out.println("aaa");
            System.out.println("aaa");
        }

对于实例方法 使用this作为锁 - 一个账户的调用

     synchronized (this) {
            System.out.println("aaa");
            System.out.println("aaa");
            System.out.println("aaa");
        }

对于静态方法,使用字节码 类名.class作为锁 - 所有线程一起调用的 所以需要用这个整个类的调用作为锁

     synchronized (xx.class) {
            System.out.println("aaa");
            System.out.println("aaa");
            System.out.println("aaa");
        }

同步方法

同步方法底层也是有隐式锁的,锁的范围是整个方法的代码

如果方法是实例方法,默认用this作为锁对象

如果是静态方法,默认用类名.class 作为锁对象

public synchronized void xx(){

}

Lock锁

image-20221009234252902

class Account{
    //一个实例一把锁
    private static Lock lock = new ReentrantLock();

    public void doSomeThing(){
        lock.lock();//上锁

        //一定要保证能够解锁
        try{
            System.out.println(11);
        }finally {
            lock.unlock();//解锁
        }

    }
}


public class LockDemo4 {

    public static void main(String[] args) {
        Lock lock = new ReentrantLock();
    }
}

线程通信

线程间互相发送数据 - 通过共享一个数据

生产者生产数据后,唤醒消费者,等待自己 消费者消费数据后,唤醒生产者,等待自己

(this.notifyAll();this.wait()

标签:Java,进阶,System,线程,println,new,随笔,pool,out
From: https://www.cnblogs.com/jy00/p/16786388.html

相关文章

  • java语言基础
    初识计算机和java语言1.计算机由硬件和软件组成计算机中的主要硬件cpu是计算机中最核心的部件,类似人的大脑一台计算机的运算核心和控制核心都由cpu完成其主要功能是......
  • Java02 前递增(减)和后递增(减)运算的区别
    ++运算符把它的单个操作数增加1,这个操作数必须是变量、数组中的元素或对象的字段。这个运算符的行为取决于它相对于操作数的位置。放在操作数之前,是前递增运算符,递增操作......
  • 2022年第 2 期《Python 测试平台开发》进阶课程(10月30号开学)
    2022年第2期《Python测试平台开发》进阶课程主讲老师:上海-悠悠上课方式:微信群视频在线教学,方便交流本期上课时间:10月30报名费:报名费3800一人(周期3个月,之前学过《pyt......
  • java-多线程
    java-多线程 以下内容为本人的学习笔记,如需要转载,请声明原文链接https://www.cnblogs.com/lyh1024/p/16786357.html 多线程1.进程与线程1.1什么是进程程序是指......
  • JavaScript 实现 -- 插入排序
    前言本文主要记录了JavaScript实现--插入排序,以及原理、时间复杂度、空间复杂度和算法稳定性。插入排序插入排序,一般也被称为直接插入排序。对于少量元素的排序,它是一......
  • windows 下java-jar启动的jar包怎么停
     1用管理员打开cmd命令窗口2输入:netstat-ano|findstr端口号92333根pid删除命令taskkill/t/f/pid2136  ......
  • IO框架(Java)
    IO框架流的概念概念:内存与存储设备之间传输数据的通道流的分类按方向输入流:将<存储设备>中的内容读入到<内存>中(read)输出流:将<内存>中的内容写入到<存储......
  • Javaweb实现后端的jdbc增删改查之查询
    首先jdbc就是Java提供给数据库的接口,jdbc通过sql语句实现对数据,数据库等的操作,今天学习了通过代码实现连接数据库和对一张表的查询。1.首选的在数据库(test)中新建一张表(tb_......
  • Java 类型转换
    1、什么是类型转换?在java中类型转换是一个非常重要的知识点。因为java是一门强类型语言,所以在数据运算中会存在类型转换,首先我们需要知道java中的类型转换一共分为两类:自......
  • Java中常用的几种for循环
    List<String>list=newArrayList<String>();list.add("HOLLEWORD!");list.add("HOLLEKITTY!");/***第一种循环方法......