miluframe({ /*个人链接地址*/ Youself:'https://www.cnblogs.com/miluluyo/', /*导航栏信息*/ custom:[{ name:'留言板', link:'https://www.cnblogs.com/miluluyo/p/11578505.html', istarget:false },{ name:'技能树', link:'https://miluluyo.github.io/', istarget:true }], /*自己的友链页面后缀*/ Friends_of_the:'p/11633791.html', /*自己的友链信息*/ resume:{ "name":"麋鹿鲁哟", "link":"https://www.cnblogs.com/miluluyo", "headurl":"https://images.cnblogs.com/cnblogs_com/elkyo/1558759/o_o_my.jpg", "introduction":"大道至简,知易行难。" }, /*友链信息*/ unionbox:[{ "name":"麋鹿鲁哟", "introduction":"生活是没有标准答案的。", "url":"https://www.cnblogs.com/miluluyo", "headurl":"https://images.cnblogs.com/cnblogs_com/elkyo/1558759/o_o_my.jpg" },{ "name":"麋鹿鲁哟的技能树", "introduction":"大道至简,知易行难。", "url":"https://miluluyo.github.io/", "headurl":"https://images.cnblogs.com/cnblogs_com/elkyo/1558759/o_o_my.jpg" }], /*点击页面时候的弹出文本显示*/ clicktext:new Array("ヾ(◍°∇°◍)ノ゙加油哟~ ——麋鹿鲁哟","生活是没有标准答案的。 ——麋鹿鲁哟"), /*github链接*/ githuburl:'https://github.com/miluluyo' })

2022-08-02 第三小组 陈迪 学习笔记

多线程:

1、创建线程

在Java中,创建线程有三种方式

1.1、继承Thread类,并且重写run方法

Thread不是抽象类,run也不是抽象方法

class MyThread extends Thread{
    @Override
    public void run() {
        System.out.println("重写的run方法");
    }
}
public class Ch01 {
    public static void main(String[] args) {
        System.out.println(1);
        MyThread myThread=new MyThread();
        //调用start方法启动一个线程时,会执行重写的run方法的代码
        //直接调run就是对象调方法
        myThread.start();
//        myThread.run();
        System.out.println(3);
        System.out.println(4);
    }
}

线程的优先级(概率问题)

1.2、实现Runnable接口

class MyThread2 implements Runnable{
    @Override
    public void run() {
        System.out.println(2);
    }
}
public class Ch02 {
    public static void main(String[] args) {
        System.out.println(1);
        MyThread2 myThread2=new MyThread2();
        //如果想要线程启动,必须调用Thread类中的start方法
        Thread t=new Thread(myThread2);
        t.start();
        System.out.println(3);
        System.out.println(4);
    }
}

1.3、箭头函数(lambda方法)

public class Ch03 {
    public static void main(String[] args) {
        System.out.println(1);
        new Thread(()-> System.out.println(2)).start();
        try{
            Thread.sleep(10000);
        }catch (Exception e){
            e.printStackTrace();
        }
        System.out.println(3);
        System.out.println(4);
    }
}

1.4、实现Callable接口

import java.util.concurrent.Callable;
import java.util.concurrent.FutureTask;
class MyThread3 implements Callable<String>{
public String call() throws Exception{
    System.out.println(2);
    return "Call方法返回值";
}
}
public class Ch04 {
    public static void main(String[] args) {
        System.out.println(1);
        FutureTask<String>futureTask=new FutureTask<>(new MyThread3());
        new Thread(futureTask).start();
        System.out.println(3);
        System.out.println(4);
    }
}

2、守护线程:

java中提供两种类型的线程:

1、用户线程

QQ 主程序就是用户线程。

2、守护程序线程

守护线程为用户线程提供服务,仅在用户线程运行时才需要。

守护线程对后台支持业务很有用

垃圾回收,大多数jvm线程都是守护线程。

创建守护线程:

线程的生命周期

从摇篮到坟墓

NEW: 这个状态是线程未被start()调用执行

RUNNABLE:线程正在JVM中被执行,等待来自操作系统的调度

BLOCKED:阻塞,因为某些原因不能立即执行需要挂起等待

WATTING:无限期等待。需要依赖Object,如果没有唤醒就一直等待。

TIMED_WATTING:有限期等待,线程等待一个指定时间

TERMINATED:终止线程的状态,线程已经执行完毕。

等待和阻塞两个概念有点像,阻塞因为外部原因,需要等待。

等待一般是主动调用方法,发起主动等待,还可以传参确定等待时间

线程安全:

1、cpu多核缓存结构

物理内存:硬盘内存。(固态)

cpu缓存为了提高程序运行的性能,现在CPU在很多方面对程序进行优化

在cpu处理内存数据时,如果内存运行速度太慢,会拖累CPU

CPU分为三级缓存:每个都有L1/L2缓存,L3多核公用。

CPU查数据时:cpu---L1---L2---L3---内存---硬盘

CPU到内存:60---80纳秒

CPU到L3: 15纳秒

CPU到L2: 3纳秒

CPU到L1: 1纳秒

CPU到寄存器:0.3纳秒

cpu每读取一个数据,读取的是与它相邻的64个字节的数据

英特尔提出了一个MESI协议

1、修改态,此缓存被动过,内容与主内存中不同,为此缓存专有

2、专有态,此缓存与主内存一致,但是其他CPU中没有

3、共享态,此缓存与主内存一致,其他缓存也有

4、无效态,此缓存无效,需要在主内存重新读取

【指令重排】:

四条指令,四个人四张纸写下【恭喜发财】。

【可见性】

【线程的争抢】:解决的最好办法是加锁

synchronize同步锁,线程同步

当一个方法加上synchronize修饰,就叫同步方法。

同步:

Java内存模型---JMM

尽量做到硬件和操作系统之间达到一致的访问效果。

volatile:内存屏障

cpu遇到这条指令会停下,去执行未执行完的代码

线程安全的实现方法:

1、数据不可变

一切不可变的对象一定是线程安全的。

对象的方法的实现方法的调用者,不需要再进行任何的线程安全的保障措施

比如final修饰的基本数据类型,字符串

2、互斥同步,加锁。【悲观锁】

3、非阻塞同步。【无锁编程】自旋,用cas来实现

4、无同步方案,多个线程共享数据,又可以在单独的线程中计算,得出结果。把共享数据的可见范围限制在一个线程之内,就无需同步,把共享的数据拿过来。从而保证线程安全。ThreadLocal

心得体会:

今天学习了多线程,大部分都是理论知识,少数是代码,需要深层次的理解和体会,希望可以理解这些内容。

posted @   jinjidecainiao  阅读(23)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
@media only screen and (max-width: 767px){ #sidebar_search_box input[type=text]{width:calc(100% - 24px)} } L2Dwidget.init({ "model": { jsonPath: "https://unpkg.com/live2d-widget-model-hijiki/assets/hijiki.model.json", "scale": 1 }, "display": { "position": "left", "width": 100, "height": 200, "hOffset": 70, "vOffset": 0 }, "mobile": { "show": true, "scale": 0.5 }, "react": { "opacityDefault": 0.7, "opacityOnHover": 0.2 } }); window.onload = function(){ $("#live2dcanvas").attr("style","position: fixed; opacity: 0.7; left: 70px; bottom: 0px; z-index: 1; pointer-events: none;") } 参数说明 名称 类型 默认值/实例 描述Youself 字符串 https://www.cnblogs.com/miluluyo/ 个人博客园首链接 custom 数组 [{ name:'相册', link:'https://www.cnblogs.com/elkyo/gallery.html', istarget:false },{ name:'技能树', link:'https://miluluyo.github.io/', istarget:true },{ name:'留言板', link:'https://miluluyo.github.io/p/11578505.html', istarget:false }] 导航信息 name 导航名 link 导航链接 istarget true跳转到新页面上,false当前页面打开 Friends_of_the 字符串 11633791 友链文章的后缀名,若字符串为空则不显示友链 resume 对象 { "name":"麋鹿鲁哟", "link":"https://www.cnblogs.com/miluluyo/", "headurl":"https://images.cnblogs.com/cnblogs_com/ elkyo/1558759/o_o_my.jpg", "introduction":"大道至简,知易行难。" } 自己的友链信息 name 导航名 link 导航链接 headurl 头像 introduction 语录 unionbox 数组 [{ "name":"麋鹿鲁哟", "introduction":"生活是没有标准答案的。", "url":"https://www.cnblogs.com/miluluyo", "headurl":"https://images.cnblogs.com/cnblogs_com/ elkyo/1558759/o_o_my.jpg" },{ "name":"麋鹿鲁哟的技能树", "introduction":"大道至简,知易行难。", "url":"https://miluluyo.github.io/", "headurl":"https://images.cnblogs.com/cnblogs_com/ elkyo/1558759/o_o_my.jpg" }] 友链数组 name 昵称 introduction 标语 url 链接地址 headurl 头像地址 clicktext 新数组 new Array("ヾ(◍°∇°◍)ノ゙加油哟~ ——麋鹿鲁哟", "生活是没有标准答案的。 ——麋鹿鲁哟"), 点击页面时候的弹出显示 githuburl 字符串 https://github.com/miluluyo github链接
点击右上角即可分享
微信分享提示