2022-08-02 day20 第一小组 王鸣赫

1|0线程

1|11.什么是线程与进程

1:进程:进程指正在运行的程序。确切的来说,当一个程序进入内存运行,即变成一个进程,进程是处于运行过程中的程序,并且具有一定独立功能。
2:线程:线程是进程中的一个执行单元,负责当前进程中程序的执行,一个进程中至少有一个线程。一个进程中是可以有多个线程的,这个应用程序也可以称之为多线程程序。
3:简而言之:一个程序运行后至少有一个进程,一个进程中可以包含多个线程

1|22.多线程编程

1|01.创建多线程

初学Java多线程编程的时候,需要掌握两种创建多线程的方法:

声明一个Thread类的子类,子类中重写Thread类的run方法。
声明一个实现Runnable接口的类,类中实现run方法。

点击查看代码
public class ThreadTest { public static void main(String[] args) { MyThread t1 = new MyThread(); MyThreadRunnable target = new MyThreadRunnable(); Thread t2 = new Thread(target); //启动线程1 t1.start(); //启动线程2 t2.start(); } } //创建线程方式一 class MyThread extends Thread { @Override public void run() { for (int i = 0; i < 1000; i++) { System.out.println("方式一-->" + i); } } } //创建线程方式二 class MyThreadRunnable implements Runnable { @Override public void run() { for (int i = 0; i < 1000; i++) { System.out.println("方式二-->" + i); } } }
1|02、线程状态

1. 初始状态(NEW)

实现Runnable接口和继承Thread可以得到一个线程类,new一个实例出来,线程就进入了初始状态。

2.1. 就绪状态(RUNNABLE之READY)
就绪状态只是说你资格运行,调度程序没有挑选到你,你就永远是就绪状态。
调用线程的start()方法,此线程进入就绪状态。
当前线程sleep()方法结束,其他线程join()结束,等待用户输入完毕,某个线程拿到对象锁,这些线程也将进入就绪状态。
当前线程时间片用完了,调用当前线程的yield()方法,当前线程进入就绪状态。
锁池里的线程拿到对象锁后,进入就绪状态。

2.2. 运行中状态(RUNNABLE之RUNNING)
线程调度程序从可运行池中选择一个线程作为当前线程时线程所处的状态。这也是线程进入运行状态的唯一的一种方式。

3. 阻塞状态(BLOCKED)

阻塞状态是线程阻塞在进入synchronized关键字修饰的方法或代码块(获取锁)时的状态。

4. 等待(WAITING)

处于这种状态的线程不会被分配CPU执行时间,它们要等待被显式地唤醒,否则会处于无限期等待的状态。

5. 超时等待(TIMED_WAITING)

处于这种状态的线程不会被分配CPU执行时间,不过无须无限期等待被其他线程显示地唤醒,在达到一定时间后它们会自动唤醒。

6. 终止状态(TERMINATED)

当线程的run()方法完成时,或者主线程的main()方法完成时,我们就认为它终止了。这个线程对象也许是活的,但是它已经不是一个单独执行的线程。线程一旦终止了,就不能复生。
在一个终止的线程上调用start()方法,会抛出java.lang.IllegalThreadStateException异常。

1|3CPU

1|0CPU多核缓存结构

物理内存:硬盘内存。(固态硬盘,尽量不要选择混合硬盘)

CPU缓存为了提高程序运行的性能,现在CPU在很多方面对程序进行优化。
CPU处理速度最快,内存次之,硬盘速度最低。
在CPU处理内存数据时,如果内存运行速度太慢,就会拖累CPU的速度
为了解决这样的问题,CPU设计了多级缓存策略。

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

CPU查找数据时,CPU->l1->l2->l3->内存->硬盘
进一步优化,CPU每次读取一个数据,读取的时与它相邻的64个字节的数据。
【缓存行】。

1|0英特尔提出了一个协议MESI协议

1、修改态,此缓存被动过,内容与主内存中不同,为此缓存专有
2、专有态,此缓存与主内存一致,但是其他CPU中没有
3、共享态,此缓存与主内存一致,其他的缓存也有
4、无效态,此缓存无效,需要从主内存中重新读取

1|4线程安全的实现方法

(1)数据不可变。一切不可变的对象一定是线程安全的。对象的方法的实现方法的调用者,不需要再 进行任何的线程安全的保障措施。比如final关键字修饰的基本数据类型,字符串。
只要一个不可变的对象被正确的创建出来,那外部的可见状态永远都不会改变。
(2)互斥同步。加锁。【悲观锁】
(3)非阻塞同步。【无锁编程】,自旋。我们会用cas来实现这种非阻塞同步。
(4)无同步方案。多个线程需要共享数据,但是这些数据又可以在单独的线程中计算,得出结果


__EOF__

本文作者404notfond
本文链接https://www.cnblogs.com/wmh19990109/p/16545393.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   404notfond  阅读(4)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示