java学习笔记之线程1

时间:2023-02-26 21:21:09

java学习笔记之线程1

  1. 前言:学习一门技术,光靠兴趣是远远不够的, 多半是得靠勤奋。我写博客的初衷是想整理一下我学java时作的一些学习笔记 。在学java的过程中遇到问题时,我也会上CSDN刷刷博客,百度搜索一下什么的,但是我觉得那些文章是别人写的,是别人的一些总结和经验,我想自己去总结一下!自己去把一些东西讲出来,写出来,这样也会对我学java有很大的帮助。写的一些东西可能会有一些错误,但是我会尽量的去避免!希望大神们勿喷。引用网上的那句话,大概意思是:把自己学到的东西给别人讲明白了,你才算真正掌握了它!

  2. 好了,不废话了,开始正文:第一篇博客要整理的东西是线程,我先直接放图吧,对于一些难理解和内容比较多的知识我会画图去加深理解,这样理解的会更深刻,我觉得。直接上图:下面这张图是线程的五个状态
    java学习笔记之线程1

引用百度百科:
线程的引入:60年代,在OS中能拥有资源和独立运行的基本单位是进程,然而随着计算机技术的发展,进程出现了很多弊端,一是由于进程是资源的拥有者,创建,撤销与切换存在较大的时空开销,因此需要引进轻型进程;二是由于对称多处理机(SMP)(?这个东西是什么我也不知道,一会查下。。。)出现,可以满足多个运行单元,二多个进程并行开销过大。
因此在80年代,出现了能独立运行的基本单元—–线程(Thread)。

先说下我对同步和异步的理解吧,因为这两个概念对于刚开始学习java的同学不太好理解
1),同步(Synchronization): cpu在同一时刻只能做一件事情,而一个个线程就是cpu要做的事情,举个例子好了,比如我就是cpu(我在同一时刻只能做一件事情),现在我要做两件事情:1:睡觉(线程),2:写博客(线程)。我自己规划协调了一下,决定把博客写完再睡觉,这个时候我就是同步的把写博客和睡觉这两件事情做完的。写到这可能有些同学有疑问了,不是同步吗?同步不就是同时,一起做吗?其实不是的,同步中的“同”应该理解为协同,调和。在上面我去做着两件事情的时候是我自己去协调来同步做的,在java程序中是怎么实现的呢?后面会说到…….

2),异步(Asynchronous):考虑到上面同步的另外一种情况:就是我写一会博客,然后去睡会觉,然后起来再写一会博客,然后再睡会觉………如此循环,直到我把这两件事情都做完,这种方式就是异步的去把这两件事情做完(我是不会去协调我什么时候写博客什么时候睡觉的,只要把这两件事做完就行)。这时我做这两件事情的时候效率是很低的,但cpu在做多件事情(处理多线程)时,大多数都是按这种方式来做的。我这个cpu的处理速度太慢了,我睡觉的时候的得躺下一会才能睡着,睡醒起来又得花很长时间才能进入到写作的状态,我花费了大量的时间和精力(资源)才把这两件事情做完,cpu却不一样,它能在不同的线程之前快速切换(当然,cpu也会消耗资源,补充:最早都是单核处理器,Intel先是发明了超线程技术,可以让一个核心在某种程度上并行2个线程,使线程减少等待,也减少切换的开支,后来AMD引入了双核处理器,Intel在双核的基础上再超线程—-网上看的

从上面的图可以看到线程一共又五种状态,他们分别是:

1). new(新建)
在面向对象中,万物皆对象!哈哈…… 当然线程也不例外,java中,我们new出来一个线程对象时,这个线程即进入了新建状态(计划好要做一件事了)。比如这样:Thread t = new Thread(); 还有其他方式,这儿就不介绍了。
2). Runnable(可运行)
光有计划还不行,我们还得准备准备,准备的事我们就让start()去做,t.start();这个方法一执行,这个线程就算是准备好了,随时听从cpu的调度,同一个线程不能调用两次start()。
3). Running(运行)
如果cpu一调度处于Runnable状态的线程,线程就处于运行状态,大家可以看到指向Running的箭头只有一个,说明要进入运行状态的前提得是可运行状态。
4). Blocked(阻塞)
由于某些原因,cpu做不下去了(比如调用了图里的那几个方法),阻塞又分为三种,在以后的文章中会说到。
5). Dead(死亡)
线程被执行完了或者因为异常而退出了run()方法。

写了一上午了,今天先写到这把,只是对线程做了一个简单的介绍,后面会继续对线程里的一些东西做详解,谢谢大家!

第二篇的链接

第二篇的链接