Java多线程学习

首先给出进程和线程的概念,如果对这两个基本概念没有理解,没有办法对线程进行学习。进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。在早期面向进程设计的计算机结构中,进程是程序的基本执行实体;在当代面向线程设计的计算机结构中,进程是线程的容器。程序是指令、数据及其组织形式的描述,进程是程序的实体。线程(英语:thread)是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。在Unix System V及SunOs中也被称为轻量进程(lightweight processes),但轻量进程更多指内核线程(kernel thread),而把用户线程(user thread)称为线程。

用多线程只有一个目的,就是更好的利用CPU的资源。在这其中有一个重要的概念,线程安全:经常用来描绘一段代码。指在并发的情况之下,改代码经过多线程使用,线程的调度顺序不影响任何结果。这个时候使用多线程,我们只需要关注系统的内存,CPU是不是够用就可以了。线程安全的优先级高于性能。

学习过程中,首先了解了线程的状态。我所学习的文章中着重提到了”Blocked”和”Waiting”这两个状态的区别,Blocked其实也是一种wait,等待的是monitor,但是和Waiting状态不一样,举个例子,有三个线程进入了同步块,其中两个调用了object.wait(),进入了waiting状态,这时第三个调用了object.notifyAll(),这时候前两个线程就一个转移到了Runnable,一个转移到了Blocked。

 

接下来对机制进行了了解,java中的每个对象都有一个监测器,来监测并发代码的重入。在非多线程编码时该监测器不发挥作用,反之如果在synchronized范围内,监视器发挥作用。当某代码并不持有监视器的使用权时,会抛出异常。

 

多线程的内存模型:main memory(主存)、working memory(线程栈),在处理数据时,线程会把值从主存load到本地栈,完成操作后再save回去(volatile关键词的作用:每次针对该变量的操作都激发一次load and save)。

 

在文章末尾详细介绍了基本线程类,包括Thread类,Runnable接口,Callable接口。Thread类的最佳实践(Runnable与之类似):写的时候最好要设置线程名称 Thread.name,并设置线程组 ThreadGroup,目的是方便管理。在出现问题的时候,打印线程栈 (jstack -pid) 一眼就可以看出是哪个线程出的问题,这个线程是干什么的。Callable:future模式:并发模式的一种,可以有两种形式,即无阻塞和阻塞,分别是isDone和get。其中Future对象用来存放该线程的返回值以及状态。

 

总结起来,对多线程有了一些初步的认识,为之后的学习打开了大门,找到了学习多线程的方向,这是java的基础部分,应该牢牢掌握,才能为以后的发展奠定良好基础。

                                            ----------部分内容节选自云时代架构公众号

posted on 2019-03-10 21:01  孟庆淋  阅读(112)  评论(0编辑  收藏  举报

导航