java中多线程入门有趣介绍
我们在网上可以看到所有有关于java的线程的基本概念的很多解释,不乏有很多详细经典的解释和代码解说。但是我们的很多初学者看完不能有一个直观的印象,特别是一些没有编程基础的学习者,很多时候要花很多时间去理解。我希望这篇文章能给初学者一个很直观,很容易理解的角度去学习。
一、java线程的生命周期
了解一个东西,要搞清楚它是怎么运作的。搞清楚内部的来龙去脉是一个学习极好的角度,而生命周期是一个很好的着手点。一个图来解释
我们只要了解上面图每一种状态的关系和相互转换就可以了,线程也就了解的一半了。
1.好,现在来看看线程开始,以new Thread()的方式诞生。
2.start()的方式进入线程的运行状态,当然线程没有直接进入运行状态,而是先进入了"可运行状态",即“就绪状态”,在调用了run()方法后才进入运行状态。好了,线程跑起来了。
(图中没有显示run()方法,当然你可以不用start(),直接使用run(),但是差别很大。Start方法让线程进入一个多线程的状态,特别是多个线程的时候,CPU会给每个线程标记,比如1号Thread、2号Thread. . . . . .如果你直接run()起来,CPU就不管你啦。不管你多少个有关于这个对象的线程,都是没有标记,就想一群脱缰的野马,控制不了。)
3.就像人一样,生命的开始和结束之间,我们除了在“奋斗”和“准备奋斗”的状态之外,另外一种状态是在休息。线程的“休息状态“就是“阻塞状态”,我们有很多种方法从“奋斗状态”转换到“休息状态”。而线程也一样,从“运行状态”到“阻塞状态”,即是wait()方法。那从“就绪状态”如何返回“运行状态”呢?对不起,不能直接到达“运行状态”,要先到“就绪状态”再到“运行状态”,而线程从“阻塞状态”到“就绪状态”使用notify()或者notifyAll()。
4.有时候我们不想去休息,只是想处于一种“暧昧”状态,可进可退。线程的“可运行状态”就是“暧昧状态”。线程如何从“运行状态”转换为“可运行状态”呢?方法很简单,sleep()和yield()。两者的区别是一个是可以定时,一个不可以。
5.然后线程进入了“可运行状态”后,如果有多个线程都想进入“运行状态”,CPU如何办?好办,java中可以给线程设置优先级,等级高就先执行罗。如果等级一样如何办?好办,公平竞争,谁厉害谁上罗(其实是随机吧,点到谁谁上)。
二、实现方式
我们了解了线程的生命历程,那我们如何创建他们呢?
- 实现Runnable接口
- 继承Thread父类
区别:这两个有什么区别
A:实现Runnable接口一个是可以摆脱java中单继承的困扰,继承Thread太单调。我们喜欢多多益善对嘛。
B:实现Runnable的优势,是多个线程共享这个对象的数据。如果是继承Thread,多个线程是各用各用的东西。
三、对象
Java中一切皆为对象。我们要线程干嘛?不就是为了来“搞对象”啦。于是我们在“搞对象”的过程中,就出现了一个问题。就一个对象,但是很多个线程都想搞它如何办?
为了协调这些线程的矛盾,java就又提出了一个关键字synchronized。这个synchronized很叼的,它就像一个裁判。有一个线程a想来用对象,如果里面有线程b。裁判就会对外面的线程a说:“对不起,里面有了线程b了。要等下,等线程b用完了对象才能让你进来”。所以很多代码要保证对象的唯一性,就要用到synchronized。
像“售票系统”,很多个客户端都来抢票,如何保证票不被多抢,导致票没了还有客户端再抢。
四、总结
本文没有代码介绍,网上已经有很多对于线程的介绍。希望读者在看完这篇文章后有一个对线程具体化的概念,在结合一个个知识点看看大神们的代码介绍就更为深刻。当然有错误的地方希望大家多多提醒。
java中多线程入门有趣介绍的更多相关文章
- Java进阶(四十二)Java中多线程使用匿名内部类的方式进行创建3种方式
Java中多线程使用匿名内部类的方式进行创建3种方式 package cn.edu.ujn.demo; // 匿名内部类的格式: public class ThreadDemo { public st ...
- Java基础-JAVA中常见的数据结构介绍
Java基础-JAVA中常见的数据结构介绍 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.什么是数据结构 答:数据结构是指数据存储的组织方式.大致上分为线性表.栈(Stack) ...
- 2.1多线程(java学习笔记) java中多线程的实现(附静态代理模式)
一.多线程 首先我们要清楚程序.进程.线程的关系. 首先进程从属于程序,线程从属于进程. 程序指计算机执行操作或任务的指令集合,是一个静态的概念. 但我们实际运行程序时,并发程序因为相互制约,具有“执 ...
- java中多线程执行时,为何调用的是start()方法而不是run()方法
Thead类中start()方法和run()方法的区别 1,start()用来启动一个线程,当调用start()方法时,系统才会开启一个线程,通过Thead类中start()方法来启动的线程处于就绪状 ...
- Java中多线程的使用(超级超级详细)线程池 7
Java中多线程的使用(超级超级详细)线程池 7 什么是线程池? 线程池是一个容纳多个线程的容器,线程池中的线程可以重复使用,无需反复创建线程而消耗过多的资源 *使用多线程的好处: 1.降低消耗,减少 ...
- Java中多线程的使用(超级超级详细)线程安全原理解析 4
Java中多线程的使用(超级超级详细)线程安全 4 什么是线程安全? 有多个线程在同时运行,这些线程可能会运行相同的代码,程序运行的每次结果和单线程运行的结果是一样的,而且其他变量的值也和预期的值一样 ...
- java中多线程中Runnable接口和Thread类介绍
java中的线程时通过调用操作系统底层的线程来实现线程的功能的. 先看如下代码,并写出输出结果. // 请问输出结果是什么? public static void main(String[] args ...
- Java中多线程原理详解
Java是少数的集中支持多线程的语言之一,大多数的语言智能运行单独的一个程序块,无法同时运行不同的多个程序块,Java的多线程机制弥补了这个缺憾,它可以让不同的程序块一起运行,这样可以让程序运行更加顺 ...
- java中多线程详解-synchronized
一.介绍 当多个线程涉及到共享数据的时候,就会设计到线程安全的问题.非线程安全其实会在多个线程对同一个对象中的实例变量进行并发访问时发生,产生的后果就是“脏读”.发生脏读,就是取到的数据已经被其他的线 ...
随机推荐
- 201771010123汪慧和《面向对象程序设计Java》第十七周实验总结
一.理论部分 1.多线程并发执行中的问题 ◆多个线程相对执行的顺序是不确定的. ◆线程执行顺序的不确定性会产生执行结果的不确定性. ◆在多线程对共享数据操作时常常会产生这种不确定性. 2.线程的同步 ...
- [CISCN 2019 初赛]Love Math
0x00 知识点 PHP函数: scandir() 函数:返回指定目录中的文件和目录的数组. base_convert() 函数:在任意进制之间转换数字. dechex() 函数:把十进制转换为十六进 ...
- mybatis+mysql 通过sql脚本生成mapper的部分内容
SQL mysql SELECT concat('<if test="', COLUMN_NAME, ' != null"> ', COLUMN_NAME, ',< ...
- 洛谷 P2196 挖地雷
题目传送门 解题思路: 记忆化搜索,题目比较坑的地方在于,这是个有向图,给的边是单向边!!!!!!!! AC代码: #include<iostream> #include<cstdi ...
- CNN:转置卷积输出分辨率计算
上一篇介绍了卷积的输出分辨率计算,现在这一篇就来写下转置卷积的分辨率计算.转置卷积(Transposed convolution),转置卷积也有叫反卷积(deconvolution)或者fractio ...
- nginx反向代理和负载均衡的实现
反向代理和负载均衡的关系可以理解为,一个ip的负载均衡就是反向代理. 反向代理使用的是:proxy_pass指令 负载均衡使用的是:proxy_pass指令+upstream指令 负载均衡的3中方 ...
- NBU For Windows 更新后无法启动Java Console
系统环境:Win Server 2016 备份软件:NBU 8.1 Case :Windows系统默认自动安装系统补丁,重启过程中自动进行了Update,打上了最新的补丁后,NBU Java Co ...
- gcc编译出现:error: invalid operands to binary & (have ‘char *’ and ‘int *’)
/************************************************************************* > File Name: ptr_varia ...
- 寒假day10
今天开始写论文,同时爬取并清洗了毕设的人才动态相关部分数据
- 系统 win 10 专业版 下载地址
thunder://QUFodHRwOi8veHoyLjgxMDg0MC5jb20vY25fd2luZG93c18xMF9jb25zdW1lcl9lZGl0aW9uc192ZXJzaW9uXzE4MD ...