Java10

news2025/1/10 11:28:00

Java10

    • (一)、配置文件
    • (二)、多线程
      • 2.1 并发和并行
      • 2.2 多线程的实现方式
      • 2.3 常见成员方法
        • 2.3.1 线程的优先级
        • 2.3.2 守护线程(备胎线程)
        • 2.3.3 礼让线程和插入线程
      • 2.4 线程生命周期
      • 2.4 线程安全问题
      • 2.5 锁
        • 2.5.1 死锁

(一)、配置文件

好处:
1.可以把软件的设置永久化存储
2.如果我们要修改参数,不需要改动代码,直接修改配置文件就行

properties配置文件:
后缀名就是properties
文件中数据都是按照键值对存储
可以往Properties添加任意类型数据,但是一般只添加string类型数据
在这里插入图片描述
特有方法:store和load
load(加载):把本地文件数据加载进程序中
store(保存):把数据写进本地文件

(二)、多线程

多线程可以让程序同时做多件事情,提高运行效率
线程:操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位(应用软件中相互独立,可以同时运行的功能)

进程:是程序的基本执行实体 (一个软件运行之后就是一个进程)

2.1 并发和并行

并发:同一时刻,多个指令在单个cpu上交替执行
并行:同一时刻,多个指令在多个cpu上同时执行

2.2 多线程的实现方式

1.继承Thread类的方式进行实现
测试类:

package dxc;

public class d1 {
    public static void main(String[] args) {
        /*
        * 多线程的第一种启动方式:
        * 1.定义一个类继承Thread
        * 2.重写run方法
        * 3.创建子类的对象,并启动线程
        *
        * */
        MyThread t1=new MyThread();
        MyThread t2=new MyThread();

        t1.setName("线程1");
        t2.setName("线程2");
        //开启线程
        t1.start();
        t2.start();
        //交替运行
    }
}

MyThread:

package dxc;

public class MyThread extends Thread {
    @Override
    public void run() {
        for (int i = 0; i <100 ; i++) {
            System.out.println(getName()+"HelloWorld");
        }
    }
}
 

2.实现Runnable接口的方式进行实现
测试类:

package dxc;

public class d2 {
    public static void main(String[] args) {
        /*
        * 1.自己定义一个类实现Runnable接口
        * 2.重写里面的run方法
        * 3.创建自己的类的对象
        * 4.创建一个Thread类的对象,并开启线程
        * */

        //创建MyRun对象,表示多线程要执行的任务
        MyRun mr=new MyRun();

        //创建线程对象
        Thread t1=new Thread(mr);//将要执行的任务放进去
        Thread t2=new Thread(mr);
        //给线程设置名字
        t1.setName("线程1");
        t2.setName("线程2");
        t1.start();
        t2.start();//交替执行

    }
}

MyRun:

package dxc;

public class MyRun implements Runnable{

    @Override
    public void run() {
        //书写线程要执行的代码
        for (int i = 0; i < 100; i++) {
            //获取到当前线程的对象
            Thread t = Thread.currentThread();
            System.out.println(t.getName()+"HelloWorld");
        }
    }
}

3.利用Callable接口和Future接口方式实现
测试类:

package dxc;

import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;

public class d3 {
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        /*
        * 特点:可以获取多线程运行的结果
        *
        * 1.创建一个类MyCallable实现Callable接口
        * 2.重写call(有返回值,表示多线程运行结果)
        * 3.创建MyCallable的对象(表示多线程要执行的任务)
        * 4.创建FutureTask对象(管理多线程运行的结果)
        * 5.创建Thread类的对象,并启动(表示线程)
        * */

        MyCallable mc=new MyCallable();
        FutureTask<Integer> ft=new FutureTask<>(mc);
        Thread t1=new Thread(ft);

        t1.start();
        Integer result = ft.get();
        System.out.println(result);
    }
}

MyCallable:

package dxc;

import java.util.concurrent.Callable;

public class MyCallable implements Callable<Integer> {

    @Override
    public Integer call() throws Exception {
        int sum=0;
        for (int i = 0; i < 100; i++) {
            sum+=i;
        }
        return sum;
    }
}

三种实现方式优缺点:
在这里插入图片描述

2.3 常见成员方法

在这里插入图片描述
注:
如果不给线程设置名字,线程有默认名字
格式:Thread-x(x从0开始)

Thread构造方法可以传递一个字符串,直接设置线程名字

JVM虚拟机启动后,会自动启动多条线程,
其中一条线程叫main线程,作用是调用main方法,并执行里面的代码

sleep():哪条线程执行到这个方法,这条线程就会在这里停留对应的时间
方法的参数就是停留的时间,毫秒。时间到了后,线程会自动醒来,继续执行下面其他代码

2.3.1 线程的优先级

Java中线程是抢占式调度(随机)
默认线程优先级是5
优先级:1-10(1最小)
优先级高,只是抢占cpu概率大,先执行完的概率大,但并非100%抢占

2.3.2 守护线程(备胎线程)

当其他非守护线程执行完毕之后,守护线程也会陆续执行完毕

2.3.3 礼让线程和插入线程

礼让线程:出让cpu的执行权
用在run方法中,尽可能让执行结果均匀

插入线程:

package dxc;

public class d5 {
    public static void main(String[] args) throws InterruptedException {
        MyThread t=new MyThread();
        t.setName("土豆");
        t.start();

        //表示把t这个线程插入到当前线程之前
        //t:土豆
        //当前线程:main线程
        t.join();

        //执行在main线程当中的
        for (int i = 0; i < 10; i++) {
            System.out.println("main线程"+i);
        }
    }
}

2.4 线程生命周期

在这里插入图片描述
sleep结束后,是不会立即执行下方代码的,要等抢到执行权

2.4 线程安全问题

线程执行有随机性。产生如数据越界,重复等等问题

同步代码块:
把操作共享数据的代码锁起来
格式:
在这里插入图片描述
锁对象可以是任意的,但是锁对象一定是唯一的
特点1:锁默认打开,有一个线程进去了,锁自动关上
特点2:当里面所有代码执行完毕,线程出来,锁自动打开

注:同步代码块不能写在循环的外面
锁对象可以使用当前类的字节码文件对象。类名.class

同步方法:把synchronized加在方法上,写在修饰符后面
特点:1.同步方法是锁住方法里面所有的代码
2.锁对象不能自己指定:非静态方法:this。静态方法:当前类的字节码文件对象

StringBuffer用于多线程安全中

需求:100个票,三个窗口卖票

package dxDemo;

public class MyRunnable implements Runnable{

    int ticket=0;
    @Override
    public void run() {
        //1.循环
        //2.同步代码块(同步方法)
        //3.判断共享数据是否到了末尾
        while (true){
         if (method()) break;
        }
    }
    private synchronized boolean   method(){
        if (ticket==100){
            return  true;
        }else {
            ticket++;
            System.out.println(Thread.currentThread().getName()+"在卖第"+ticket+"张票");
        }
        return false;
    }
}

test:

package dxDemo;

public class test {
    public static void main(String[] args) {
        MyRunnable mr=new MyRunnable();

        Thread t1=new Thread(mr);
        Thread t2=new Thread(mr);
        Thread t3=new Thread(mr);

        t1.setName("窗口1");
        t2.setName("窗口2");
        t3.setName("窗口3");

        t1.start();
        t2.start();
        t3.start();
    }
}

2.5 锁

手动上锁和释放锁:
void lock():获得锁
void unlock():释放锁
在这里插入图片描述

卖票代码改成手动锁

package dxDemo;

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

public class MyRunnable implements Runnable{

   static  int ticket=0;
   static Lock lock=new ReentrantLock();
    @Override
    public void run() {
        //1.循环
        //2.同步代码块(同步方法)
        //3.判断共享数据是否到了末尾
        while (true){
            lock.lock();
            try {
                if (ticket==100){
                    break;
                }else {
                    Thread.sleep(10);
                    ticket++;
                    System.out.println(Thread.currentThread().getName()+"在卖第"+ticket+"张票");
                }
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }finally {
                lock.unlock();
            }
        }
    }

}

2.5.1 死锁

是一种错误(一个线程拿a锁,一个拿b锁,都在等对方解锁)
不要让锁嵌套,容易造成死锁,使代码卡死

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/515169.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Android Input kl文件实现键值映射

Android Keyevent定义在KeyEvent.java 截图对应 public static final int KEYCODE_SYSRQ 120; adb shell input keyevent SYSRQLinux Scancode定义在input-event-codes.h #define KEY_SCALE 120可以看到是不对应的 本来想通过指纹双击实现截图功能&#xff0c;发现上报scanco…

浅谈性能测试策略的理解

面对日益复杂的业务场景和不同的系统架构&#xff0c;前期的需求分析和准备工作&#xff0c;需要耗费很多的时间。而不同的测试策略&#xff0c;也对我们的测试结果是否符合预期目标至关重要。 这篇博客&#xff0c;聊聊我个人对常见的性能测试策略的理解&#xff0c;以及它们…

tkinter+爬虫(re库,tkinter库详解)

1.安装和认识本次实验所需要的库 re库&#xff08;正则库&#xff0c;本次实验用于匹配文本&#xff09; tkinter库 &#xff08;GUI库&#xff0c;用于制作可视化界面&#xff09; requests库 &#xff08;网络请求库&#xff0c;用于制作爬虫&#xff09; re和tkinter均为…

node 脚本调试

Node 脚本调试 node --inspect-brk index.js 执行以上命令&#xff0c;然后打开浏览器的控制台会发现有个node的logo 点击这个图标就可以开始调试代码 调试webpack 只需要找到webpack的执行入口&#xff0c;然后执行以下命令&#xff0c;只要是node脚本都可以进行调试。 n…

Shell脚本完成web服务器的建设

一&#xff0c;要求 1&#xff0c;安装httpd软件 2&#xff0c;定义防火墙规则 3&#xff0c;设置selinux为强制模式 4&#xff0c;web服务器的端口为8080 5&#xff0c;web服务器的内容目录为 /www/8080 6&#xff0c;所有操作开机有效 7&#xff0c;所有操作必须进行…

2022年上半年软件设计师下午试题

【试题四】&#xff08;共15分&#xff09; 阅读下列说明和C代码&#xff0c;回答问题1至问题3&#xff0c;将解答写在答题纸的对应栏内。 工程计算中经常要完成多个矩阵相乘的计算任务&#xff0c;对矩阵相乘进行以下说明。 (1)两个矩阵相乘要求第一个矩阵的列数等于第二个…

适合广告行业使用的企业网盘工具

Zoho Workdrive 是一款非常适合广告行业使用的企业网盘工具&#xff0c;它可以帮助广告行业进行高效、有序的项目管理。作为一名广告行业从业者&#xff0c;你是否遇到过以下问题&#xff1f; 2.文件无法有效共享 团队合作效率低下客户需求无法及时满足 这些问题都会严重影响项…

【Linux】Redis高可用概述2(Redis 发布订阅、Redis 事务、Redis主从复制)

一、Redis 发布订阅 Redis 发布订阅(pub/sub)是一种消息通信模式&#xff1a;发送者(pub)发送消息&#xff0c;订阅者(sub)接收消息。 发送者可以向多个订阅者发送消息&#xff0c;订阅者可以收到多个发送者送来的消息&#xff0c;也就是是说发送者和订阅者是多对多的关系 实例…

MATLAB中资源管理器无法安装资源解决方法详细教程

摘要&#xff1a;介绍使用MATLAB获取附加功能时出现“续订软件维护服务”的界面问题解决方案&#xff0c;即使用预先从官网下载的安装包文件&#xff0c;直接运行离线安装文件后会自动弹出附加功能管理界面&#xff0c;这时可以安装该附加工具&#xff0c;详细过程见以下介绍。…

ProtoBuf原理

一、文章 https://zhuanlan.zhihu.com/p/404782892 二、测试 1.test.proto syntax "proto3";package proto; option go_package "./;proto";message Msg{uint32 age1 1;sint32 age2 2;string name 3;bytes data 4; }2.main.go package mainimpor…

【滤波】多元卡尔曼滤波器

本文主要翻译自rlabbe/Kalman-and-Bayesian-Filters-in-Python的第6章节06-Multivariate-Kalman-Filters&#xff08;多元卡尔曼滤波器&#xff09;。 %matplotlib inline#format the book import book_format book_format.set_style()简介 我们现在准备研究和实现完整的、多…

财报解读:Q2业绩指引未达预期,狂奔的爱彼迎要减速了?

全球民宿龙头爱彼迎Airbnb迎来了一个强劲的开端。 美东时间5月9日盘后&#xff0c;爱彼迎发布了2023年第一季度财报。财报显示&#xff0c;爱彼迎一季度营收、净利润、总预订金额都获得了不同程度增长&#xff0c;超出市场预期。美中不足的是&#xff0c;公司预计二季度营收下…

分组卷积和深度可分离卷积

文章目录 一、常规卷积操作二、分组卷积三、深度可分离卷积 一、常规卷积操作 在图中&#xff0c;输入的特征图大小为 H * W * 4 卷积核个数为 2 个&#xff0c;每个卷积核的大小为 K * K * 4 输出的特征图大小为 H’ * W’ * 2 二、分组卷积 &#xff01;&#xff01;&#…

Java 内存模型

JVM 内部使用的 Java 内存模型&#xff0c; 在逻辑上将内存划分为 线程栈&#xff08;thread stacks&#xff09;和堆内存 &#xff08;heap&#xff09;两个部分。 如下图所示&#xff1a; JVM 中&#xff0c;每个正在运行的线程&#xff0c;都有自己的线程栈。 线程栈包含了当…

多表查询~

文章目录 多表查询内连接外连接子查询单行单列多行单列多行多列 多表查询 笛卡尔积:有A,B两个集合 取A,B所有的组合情况 内连接 要想查询某一章表的某个字段&#xff0c;可用 表名.字段名表示 也可以给表起别名 隐式内连接INNER可省略 外连接 外连接分左外连接和右外连接 子查…

堆排序创建

堆排序创建 一、介绍1、什么是堆2、大项堆&#xff08;排序前&#xff09;3、小项堆&#xff08;排序前&#xff09;4、排序思想 二、大项堆排序案例1、流程2、讲解 三、总结 一、介绍 1、什么是堆 堆是一种叫做完全二叉树的数据结构&#xff0c;可以分为大项堆&#xff0c;小…

计算机知识 小tips

目录 什么是R语言&#xff1f; 电脑长期不关机会产生什么影响&#xff1f; nlp是什么&#xff1f; cv是什么&#xff1f; 什么是R语言&#xff1f; R语言是一种用于数据分析和统计建模的编程语言和环境。它由新西兰奥克兰大学的Ross Ihaka和Robert Gentleman于1995年开发而…

【C语言督学训练营 第十三天】栈与循环队列的顺序实现与链式实现

文章目录 前言栈--思想栈--代码实战队列--思想队列--代码实战真题实战&#xff01; 前言 栈与队列是数据结构中最常见的数据结构之一&#xff0c;因其特性往往可以将问题简单化&#xff0c;在使用栈与队列时要牢记&#xff1a;栈&#xff1a;先进后出&#xff0c;队列&#xf…

逆向练习及相关总结

文章目录 crakeme练习crackme1crackme2crackme3 解题步骤总结关键代码查找方法常见代码C类对象逆向分析C虚函数逆向分析 crakeme练习 crackme1 学到的知识点&#xff1a; main函数查找方法&#xff1a;运行到EntryPoint -> 第一个call&#xff08;一般在第三行&#xff09…

如何用u盘重装系统win7

​如今的U盘重装win7系统是比较常见的重装win7系统的方法&#xff0c;适用性比较高&#xff0c;操作也十分的简单。有的小伙伴想给自己的电脑重装win7&#xff0c;那么我们用u盘重装系统怎么安装win7?现在小编就来教大家如何用u盘重装系统教程。 工具/原料&#xff1a; 系统…