工作忙起来,竟然把博客都忘了,罪过罪过。
1.引言
几天我一直有在看多线程基础方面的东西。因为多线程是编程中避免不了的东西。因此学习多线程很有必要。这里就先简单介绍一下多线程的基础概念。后续有深入的学习研究。
多线程是Java中不可避免的一个重要主体。关注我的博友们,将与我一道展开对多线程的学习。然后,接下来的内容,是对JUC(java.util.concurrent)的研究。“基础篇”中只涉及Object的wait()、notify()等接口、Thread类中的接口和多线程锁机制。
2.线程基础
2.1 线程的概述
线程是一个程序的多个执行路径,执行调度的单位,依托于进程存在。线程不仅可以共享进程的内存,而且还拥有自己的栈空间,栈空间是建立线程时由系统分配的,主要用来保存线程内部所使用的数据。
2.2 为什么使用线程
在Java程序中使用多线程有许多原因,使用线程的一些原因是他们可以帮助:
a.使响应更快
b.利用多个处理器系统
c.执行异步或后台处理:在不阻塞整个程序的情况下,执行阻塞io。
d.利用多个线程分解大任务。
2.3 什么情况下使用线程
使用线程是有代价的,如果程序时计算密集型且每一步都有依赖,那么使用线程反而导致效率下降,因为多个线程之间需要切换,还要负责维护锁,信号量等设施,对并行计算的计算密集型问题和i/o与计算可重叠的问世使用多线程,一般会达到显著的效果。程序中有多个可并发的模块的时候,使用线程也能提高程序的响应速度。
3.多线程的概念
3.1 线程状态图
(网上一搜一堆,但是这里有必要给出一下)
3.2 线程状态说明
线程共包括以下6种状态。
1.New(新创建):当用new操作符创建一个新线程时,比如new Thread(r),该线程还没有开始运行。这意味着它的状态是new。
2.Runnable(可运行):一旦调用线程的start()方法,线程处于runnable状态,一个可运行的线程可能处于正在运行也可能没有运行,这取决于操作系统给线程提供运行的时间。
3.Blocked(被阻塞):当线程处于被阻塞状态时,它暂时不活动,它不运行任何代码且消耗最小的资源。知道线程调度器重新激活它。当一个线程试图获取一个内部的对象锁,而该锁被其他线程所持有,则该线程进入阻塞状态。当所有其他线程释放该锁,并且线程调度器允许本线程持有它时,该线程将变成非阻塞状态。
4.Waiting(等待):当线程等待另一个线程通知调度器一个条件时,它自己进入等待状态。在调用Object.wait方法或Thread.join方法,就会出现这种情况。
5.Timed waiting(计时等待):有几个方法有一个超时参数。调用它们导致线程进入计时等待状态。这一状态将一直保持到超时期满或者接收到适当的通知。带有超时参数的方法有Thread.sleep和Object.wait、Thread.join、Lock.tryLock以及Condition.await。
6.Terminated(被终止):线程因两个原因而终止:a.因为run方法正常退出而自然终止。b.因为一个没有捕获的异常终止了run方法而意外死亡。特别地,可以调用线程的stop方法杀死一个线程。该方法抛出ThreadDeath错误对象,由此杀死线程。
这6种状态涉及到的内容包括Object类,Thread和synchronized关键字,这些内容我们将在后续章节逐个学习。
4.总结
今天先了解一下Java线程和多线程的基本概念,下面将介绍具体的多线程实现以及用法,这对后续章节的学习很有帮助。
来源:oschina
链接:https://my.oschina.net/u/2808406/blog/747970