Java多线程——基本概念

线程和多线程

程序:是一段静态的代码,是应用软件执行的蓝本

进程:是程序的一次动态执行过程,它对应了从代码加载、执行至执行完毕的一个完整过程,这个过程也是进程本身从产生、发展至消亡的过程

线程:是比进程更小的执行单位。进程在其执行过程中,可以产生多个线程,形成多条执行线索,每条线索,即每个线程也有它自身的产生、存在和消亡的过程,也是一个动态的概念

主线程:(每个Java程序都有一个默认的主线程)

当JVM加载代码发现main方法之后,就会立即启动一个线程,这个线程称为主线程

注意:主线程不一定是最后完成执行的线程,各个线程运行时完全独立,争夺cpu,很可能主线程执行完了,子进程没有。

单线程:如果main方法中没有创建其他的线程,那么当main方法执行完最后一个语句,JVM就会结束Java应用程序

多线程:如果main方法中又创建了其他线程,那么JVM就要在主线程和其他线程之间轮流切换,JVM要等程序中所有线程都结束之后才结束程序。

多线程的优势:

减轻编写交互频繁、涉及面多的程序的困难

程序的吞吐量会得到改善

由多个处理器的系统,可以并发运行不同的线程

“同时”执行是人的感觉,在线程之间实际上轮换执行

线程生命周期(五个状态新建、就绪、运行、阻塞、死亡

新建状态:线程对象已经创建,还没有在其上调用start()方法

就绪状态:当线程调用start方法,但调度程序还没有把它选定为运行线程时线程

运行状态:线程调度程序从可运行池中选择一个线程作为当前线程时线程所处的状态。(是线程进入运行状态的唯一方式)

阻塞(等待/睡眠)状态:线程仍旧是活的,但是当前没有条件运行。当某件事件出现,他可能返回到可运行状态

死亡状态:当线程的run()方法完成时就认为它死去。线程一旦死亡,就不能复生。 一个死去的线程上调用start()方法,会抛出java.lang.IllegalThreadStateException异常


Java中两种创建线程的方式:

1.继承Thread

重写run() 方法

new一个线程对象

调用对象的 start() 启动线程

优点:编写简单,如果需要访问当前线程直接使用this即可获得当前线程.

缺点:因为线程类已经继承了Thread类,不能再继承其他的父类

 

2.实现Runnable接口

实现run() 方法

创建一个Runnable类的对象r,new MyRunnable()

创建Thread类对象并将Runnable对象作为参数,new Thread(r)

调用Thread对象的start()启动线程

优点:线程类只实现了Runable接口,还可以继承其他的类.

缺点:编程稍微复杂,需要访问当前线程,必须使用Thread.currentThread()方法

 

线程创建的问题:

线程的名字:JVM给的名字或者我们自定义的名字,通过setName方法设置

获取当前线程对象:Thread.currentThread()

在一个程序里多个线程只能保证其开始时间,而无法保证其结束时间,执行顺序也无法确定

一个线程的run方法执行结束后,该线程结束

一个线程只能被启动一次,一次只能运行一个线程

JVM线程调度程序决定实际运行哪个处于可运行状态的线程。采用队列形式

线程中的常用方法:

start():启动线程,让线程从新建状态进入就绪队列排队

run():线程对象被调度之后所执行的操作

sleep():暂停线程的执行,让当前线程休眠若干毫秒

currentThread():返回对当前正在执行的线程对象的引用

isAlive():测试线程的状态,新建、死亡状态的线程返回false

interrupt():“吵醒”休眠的线程,唤醒“自己”

yield():暂停正在执行的线程,让同等优先级的线程运行

join():当前线程等待调用该方法的线程结束后,再排队等待CPU资源

stop():终止线程

阻止线程执行的方法:

线程睡眠:(当线程睡眠时,它暂停执行,当睡眠时间到期,则返回到可运行状态)

Thread.sleep()

使用场景:线程执行太快

需要强制设定为下一轮执行

线程睡眠是帮助其他线程获得运行机会的最好方法

线程睡眠到期自动苏醒,并返回到可运行状态(不是运行状态)

sleep()中指定的时间是线程不会运行的最短时间(sleep()方法不能保证该线程睡眠到期后就开始执行)

sleep()是静态方法,只能控制当前正在运行的线程

 

线程的优先级

设置线程优先级:

1.线程默认优先级是创建它的执行线程的优先级

2.通过Thread实例调用setPriority()方法设置线程优先级

Thread.MIN_PRIORITY       (1)

Thread.NORM_PRIORITY     (5)

Thread.MAX_PRIORITY      (10)

通过Thread示例调用getPriority()方法得到线程优先级

 

线程让步(yield方法 暂停当前正在执行的线程对象,并执行同等优先级的其他线程)

Thread.yieId();

yield()将导致线程从运行状态转到可运行状态,有可能没有效果无法保证yield()达到让步目的,因为让步的线程还有可能被线程调度程序再次选中

线程离开运行状态的方法:

1.调用Thread.sleep():使当前线程睡眠至少多少毫秒(尽管它可能在指定的时间之前被中断)

2.调用Thread.yield():不能保障太多事情,尽管通常它会让当前运行线程回到可运行性状态,使得有相同优先级的线程有机会执行

3.调用join()方法:保证当前线程停止执行,直到调用join方法的线程完成为止。然而,如果调用join的线程没有存活,则当前线程不需要停止

4.线程的run()方法完成

 

多线程问题——资源协调

两个线程A和B在同时使用Stack的同一个实例对象,A正在往堆栈里push一个数据,B则要从堆栈中pop一个数据

这时,假设idx=5

如果push执行了第一行,没执行第二行,也就是说idx并没有+1,这时开始执行pop,弹出的元素就不对了,并且落下了一个元素。

synchronized是Java中的关键字,是一种同步锁。它修饰的对象有以下几种:

1. 修饰一个代码块,被修饰的代码块称为同步语句块,其作用的范围是大括号{}括起来的代码,作用的对象是调用这个代码块的对象;

2. 修饰一个方法,被修饰的方法称为同步方法,其作用的范围是整个方法,作用的对象是调用这个方法的对象;

3. 修饰一个静态的方法,其作用的范围是整个静态方法,作用的对象是这个类的所有对象;

4. 修饰一个类,其作用的范围是synchronized后面括号括起来的部分,作用主的对象是这个类的所有对象。

Synchronized的作用主要有三个:(1)确保线程互斥的访问同步代码(2)保证共享变量的修改能够及时可见(3)有效解决重排序问题。

资源同步——对象互斥锁

关键字synchronized 与对象互斥锁联合起来使用保证对象在任意时刻只能由一个线程访问

synchronized可以修饰方法,表示这个方法在任意时刻只能由一个线程访问

synchronized可以修饰类,则表明该类的所有对象共用一把锁

多线程同步模型(生产者——消费者示例)

多线程问题——死锁

(两个或两个以上的线程在执行过程中,因争夺资源而造成了互相等待)

产生死锁的必要条件

互斥条件:指线程对所分配到的资源进行排它性使用

请求和保持条件:指线程已经保持至少一个资源,但又提出了新的资源请求

不可剥夺条件:进程已获得的资源,在未使用完之前,不能被剥夺,只能在使用完时由自己释放

环路等待条件:指在发生死锁时,必然存在一个线程—资源的环形链

出现死锁的情况

相互排斥:一个线程永远占用某一共享资源

循环等待:线程A在等待线程B,线程B在等待线程C,线程C在等待线程A

部分分配:线程A得到了资源1,线程B得到了资源2,两个线程都不能得到全部的资源

缺少优先权:一个线程访问了某资源,但一直不释放该资源,即使该线程处于阻塞状态

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

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

相关文章

textCNN初探

文章目录目录1.什么是textCNN1.1 textCNN 提出的背景1.2 textCNN 合理性分析2.textCNN相比于传统图像领域的CNN有什么特点?3.textCNN例子讲解3.1 参数和超参数3.2 textCNN的数据3.3 textCNN的网络结构定义3.4 代码目录 1.什么是textCNN 1.1 textCNN 提出的背景 我…

词嵌入初探

文章目录目录1.词嵌入产生的背景1.1 NLP关键:语言的表示1.2 NLP词的表示方法类型1.2.1 独热表示one-hot1.2.2 词的分布式表示distributed representation1.3 NLP中的语言模型1.4 词的分布表示1.4.1 基于矩阵的分布表示1.4.2 基于聚类的分布表示1.4.3 基于神经网络的…

VIM使用系列之一——配置VIM下编程和代码阅读环境

作者:gnuhpc from http://blog.csdn.net/gnuhpc http://gnuhpc.wordpress.com/ 本文环境:ubuntu 10.10/vim7.2 前言:一年前写过一篇关于VIM的C/C编程环境的文字,一年中又接触了很多东西,深入使用中发现其实还是需要有…

fastText初探

目录:1、应用场景2、优缺点3、FastText的原理4、FastText词向量与word2vec对比 目录: 1、应用场景 fastText是一种Facebook AI Research在16年开源的一个文本分类器。 其特点就是fast。相对于其它文本分类模型,如SVM,Logistic …

python中使用“if __name__ == '__main__'”语句的作用

首先用最简洁的语言来说明一下 if __name__ __main__: 的作用:防止在被其他文件导入时显示多余的程序主体部分。 先举个例子,如果不用if __name__ __main__: 会发生什么事: 首先在yy.py中调用cs.py #yy.pyimport csprint(引用cs)cs.cs()p…

redis——sentinel

什么是哨兵机制 Redis的哨兵(sentinel) 系统用于管理/多个 Redis 服务器,该系统执行以下三个任务: 监控: 哨兵(sentinel) 会不断地检查你的Master和Slave是否运作正常。 提醒:当被监控的某个 Redis出现问题时, 哨兵(sentinel) 可以通过 API 向管理员或者其他…

FM,FFM及其实现

在推荐系统和计算广告业务中,点击率CTR(click-through rate)和转化率CVR(conversion rate)是衡量流量转化的两个关键指标。准确的估计CTR、CVR对于提高流量的价值,增加广告及电商收入有重要的指导作用。业界…

linux-在cenos上安装大全(nginx/JRE/maven/Tomcat/MYSQL/redis/kafka/es...)

云服务器 阿里云 腾讯云 七牛云 百度云 天翼云 华为云 西部数码 自己购买一个,学生和企业用户都有优惠的。 putty 自己下载一个putty,用来操作云服务器。 putty.org 一路下一步就ok。 点击putty.exe,输入你的ip或域名 最好改成20&#xff1…

KKT条件初步理解

最近学习的时候用到了最优化理论,但是我没有多少这方面的理论基础。于是翻了很多大神的博客把容易理解的内容记载到这篇博客中。因此这是篇汇总博客,不算是全部原创,但是基础理论,应该也都差不多吧。因才疏学浅,有纰漏…

redis——实战点赞

点赞功能随处可见,我们都知道点赞是一个非常高频的操作,redis就非常适合做这种工作。 实现效果: 分析:三种类型:给帖子点赞,给评论点赞,给回复点赞 我们只实现查看点赞数量的话,只…

大数据学习(10)--流计算

文章目录目录1.流计算的概述1.1 什么是流数据?1.2 批量计算和实时计算1.3 流计算的概念1.4 流计算和Hadoop1.5 流计算框架2.流计算的处理流程2.1 流计算处理基本概念2.2 数数据的实时获取2.3 数据的实时计算2.4 实时查询任务3.流计算的应用和开源框架Strom3.1 流计算…

redis——实战关注

效果: 思路:很好想,把自己的粉丝和自己关注的人都存起来(set即可),做增删改查。 package com.now.community.community.service;import com.now.community.community.entity.User; import com.now.commun…

神经网络中的优化算法总结

在调整模型更新权重和偏差参数的方式时,你是否考虑过哪种优化算法能使模型产生更好且更快的效果?应该用梯度下降,随机梯度下降,还是Adam方法? 这篇文章介绍了不同优化算法之间的主要区别,以及如何选择最佳的…

Java开发需要知道的HTML知识

概述 HTML(HyperText Markup Language) 不是一门编程语言,而是一种用来告知浏览器如何组织页面的标记语言。 HTML 可复杂、可简单,一切取决于开发者。它由一系列的元素组成,这些元素可以用来包围不同部分的内容,使其以某种方式呈…

处理机调度与死锁

处理机调度与死锁 处理机调度的层次 高级调度 高级调度又称为作业调度或长程调度,其主要功能是根据某种算法,把外存上处于后备队列中的那些作业调入内存,也就是说,它的调度对象是作业。 1.作业和作业步 作业:一个比程…

各种卷积

从最开始的卷积层,发展至今,卷积已不再是当初的卷积,而是一个研究方向。在反卷积这篇博客中,介绍了一些常见的卷积的关系,本篇博客就是要梳理这些有趣的卷积结构。 阅读本篇博客之前,建议将这篇博客结合在一…

springboot——kaptcha

导入包&#xff1a; <dependency><groupId>com.github.penggle</groupId><artifactId>kaptcha</artifactId><version>2.3.2</version></dependency> 配置类&#xff1a; package com.now.community.community.config;import…

NLP复习资料(7)-机器翻译、文本分类、情感分析

NLP复习资料国科大&#xff0c;宗老师《自然语言处理》课程复习笔记&#xff0c;个人整理&#xff0c;仅供参考。此部分为手稿&#xff0c;高清图下载见链接&#xff1a;https://download.csdn.net/download/sinat_40624829/11662412

redis——对项目的一些优化方案

这是我们之前项目的业务流程&#xff0c;做一下简单介绍。 登录&#xff1a; 用户输入账号、密码、验证码。我们先判断用户输入的验证码是不是我们session存的验证码&#xff0c;然后去查账号密码是否正确。 如果登录成功&#xff0c;发送给用户一张凭证&#xff08;ticket&a…

深度模型压缩论文(02)- BlockSwap: Fisher-guided Block Substitution for Network Compression

文章目录1.摘要和背景1.1 摘要1.2 背景2.方法和贡献2.1 方法2.2 贡献3.实验和结果3.1 实验3.2 结果4.总结和展望4.1 总结4.2 展望本系列是在阅读深度神经网络模型小型化方面论文时的笔记&#xff01;内容大部分从论文中摘取&#xff0c;也会有部分自己理解&#xff0c;有错误的…