11 多线程

news/2025/1/13 11:46:55/

多线程

程序在快速切换(时间片)完成多线程的操作

并行:同一时间点执行多个任务,多核操作

并发:同一个时间段执行多个任务,单核快速切换

说说进程和线程的区别

一个进程可以运行多个线程,多个进程的数据很难进行共享,多个进程可以同时运行

一个线程就是进程的一个执行单元,多个线程可以共享数据,多个线程只能在cpu中逐个运行

一个Java程序启动后至少有几个线程?他们的作用是什么?

最少需要两个线程:main主线程,后台线程

主线程作用:运行简单的java程序

后台线程的作用:清理运行java程序过程中所产生的垃圾

自定义线程的方式有几种?他们的区别是什么?

自定义线程的方式有两种:

继承Tread类:Tread父类中有许多写好的功能可以直接使用,创建对象的时候比较方便,启动线程的时候也很方便

示例:

public class GameThread extends Thread {//通过复写run方法来实现当前线程需要执行的任务@Overridepublic void run() {for (int i = 0; i < 100; i++) {System.out.println("玩游戏");}}}public static void main(String[] args) {
//创建线程对象GameThread game = new GameThread();game.start();//开启线程的方法(执行线程的任务)//使用start方法,不是run方法    

实现Runable接口:该接口里面只有一个run方法,只能依赖Trea进行启动,但这种方式可以让多个对象共享一个资源,比Tread方法更好

示例:

public class GameRunable extends Thread {//通过复写run方法来实现当前线程需要执行的任务@Overridepublic void run() {for (int i = 0; i < 100; i++) {System.out.println("玩游戏");}}}public static void main(String[] args) {GameRunable gameRunable = new GameRunable();Thread gameThread = new Thread(gameRunable);gameThread.start();}

说说线程的生命周期和不同状态的线程的转换关系

1.新生状态:new线程的时候存在,调用star()方法进入就绪状态

2.可运行状态:就绪状态:此时程序还没有运行,等待cpu的调度

​ 运行状态:执行里面的run方法,直到阻塞或完成任务而死亡

阻塞状态:遇到 特殊情况,同步,等待i/o会暂停执行,进入等待状态

等待状态:一个程序由可运行状态转为等待状态,等到另一个线程执行完成后再转到可运行状态继续执行

计时等待状态:设定一个提示器等待特定时间,等待时间段结束后,无论上一个程序是否执行完毕,该程序都会执行

终止状态:表示线程结束.

说说同步和异步的区别

同步:将多线程执行效果转为单线程执行,串行执行,后面的线程只能等待前面的线程执行完成后子再执行,这样等待的时间太长,比较安全

异步:将线程执行时的等待时间用来执行其他的线程,等该线程的等待时间结束再抢占cpu资源进行执行,比较节约时间,但是不安全

说说你对多线程并发访问带来的问题的理解

当多个线程访问同一个资源的时候,会出现第一个线程还没有执行完还在等待的时候,另一个线程抢占到cpu的资源就进去执行,此时里面的变量会改变,此时第一个线程再执行时的变量已经发生了改变,结果就会出错,就会导致线程出现安全问题.

如何解决多线程并发访问带来的问题?

给线程增加一个同步锁,该锁的作用就是谁先拿到这个锁,谁就先执行,其他的线程只能在外面等待该线程执行完成后才能进去执行,保证线程的安全.

同步代码块

//继承Tread:
public class TiickedWindow extends Thread{private static  int number=1;//static用来固定数量//任意创建一个对象,保证多个线程共享该对象,作为对象private static  Object o=new Object();public  TiickedWindow(String name ){super(name );}public  void run(){for (int i = 1; i < 50; i++) {if (number >= 50) {break;}//使用同步锁synchronized (o){System.out.println(Thread.currentThread().getName()+"卖出第" + number + "张票");number++;}}}}//实现Runable接口public class TickedRunable implements Runnable {private int number = 1;@Overridepublic void run() {//获取线程的名字:先获取线程,再获取线程名字for (int i = 1; i < 50; i++) {if (number > 50) {break;}//将同步的代码块放在同步代码块中//同步锁,保证多个线程使用同一把锁(对象)synchronized (this){System.out.println(Thread.currentThread().getName()+"卖出第" + number + "张票");number++; }} }}

同步方法:

//继承Tread
public class TiickedWindow extends Thread{private static  int number=1;//static用来固定数量public  TiickedWindow(String name ){super(name );}//使用静态方法synchronized  public static void sellTicked(){if(number>50){return;}System.out.println(Thread.currentThread().getName()+"卖出第" + number + "张票");number++;}public  void run(){for (int i = 1; i < 50; i++) {sellTicked();}}}//实现Runable接口
public class TickedRunable implements Runnable {private int number = 1;synchronized  public  void sellTicked() {if (number > 50) {return;}System.out.println(Thread.currentThread().getName() + "卖出第" + number + "张票");number++;}@Overridepublic void run() {//获取线程的名字:先获取线程,再获取线程名字for (int i = 1; i < 50; i++) {sellTicked();}}}

http://www.ppmy.cn/news/80473.html

相关文章

深入理解Java ThreadLocal及其内存泄漏防范

文章目录 一、ThreadLocal简介二、ThreadLocal的内存泄漏问题三、防止ThreadLocal导致的内存泄漏四、总结 一、ThreadLocal简介 在Java中&#xff0c;ThreadLocal是一种线程封闭的机制&#xff0c;其主要目的是为每个线程都创建一个单独的变量副本。这意味着&#xff0c;每个线…

springboot使用线程池的实际应用(一)

好的&#xff0c;这里是一个多线程应用于大量数据处理并且返回数据库的例子。 假设我们需要从数据库中查询所有用户的信息&#xff0c;然后对这些用户数据进行批量处理&#xff0c;并将结果写回数据库中。在处理大量数据时&#xff0c;单个线程可能会花费很长时间来完成任务&a…

【英语文学导读】课程论文《哈姆雷特》读后感

蓦然回首&#xff0c;尘埃落定 ——读《哈姆雷特》有感 一、戏剧故事梗概 一部作品是否伟大&#xff0c;一部分取决于作者笔下的作品本身&#xff0c;还有一个至关重要的部分便是它的受众&#xff0c;即读者的文本解读&#xff0c;想必“一千个读者心中有一千个哈姆雷特”就是…

Emacs之打开交互log(九十六)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…

解决:在单项目组件里面引入 base.scss/ base.less 等的外部文件不成功的问题

1、问题展示&#xff1a; 其一、问题描述&#xff1a; 在单文件组件里面使用封装在 base.scss 或 base.less 里面的样式用法一直不成功&#xff1b; 其二、代码&#xff1a; // 虽然已经标明了用的是 scss 的语法&#xff0c;但是页面调用 .scss 里的 style 样式还是不成功&a…

十几年老员工提出的五条有效沟通的建议

作为一个职场老手&#xff0c;我深知有效沟通对于职业生涯的重要性。以下是我为职场新人提出的一些关于有效沟通的建议&#xff1a; 倾听对方的意见和建议 在职场上&#xff0c;我们需要与同事、领导或客户进行沟通。在沟通中&#xff0c;我们不仅要表达自己的意见和看法&…

MyBatis-Plus02 条件构造器QueryWrapper、UpdateWrapper、Condition、LambdaQuery用法详解

目录 ①. 条件构造器与常用的接口 ②. QueryWrapper ③. UpdateWrapper ④. Condition——简化代码开发 ⑤. LambdaQueryWrapper ⑥. LambdaUpdateWrapper ①. 条件构造器与常用的接口 ①. Wrapper介绍&#xff1a; 条件构造器&#xff08;Wrapper&#xff09;的作用&…

雷达中的无源和有源的区别

常规雷达探测目标时&#xff0c;需要源源不断地发射无线电波&#xff0c;所以叫有源雷达( active radar)。有源雷达的优点是能自主搜索目标&#xff0c;因为它接收的是自己发射的电磁波&#xff0c;所以灵敏度高&#xff0c;分辨率好。但这种雷达易受目标的电磁干扰&#xff0c…