java多线程编程(一基础概念)
1、进程和线程
进程,是一个正在运行的程序实体,windows下常见的就是xxx.exe,在任务管理器中可以看见很多个进程。它是线程的容器。
线程,是进程中的一个执行流。在单线程编程中,我们的程序只有一个执行流:主线程的main方法。流,表明执行的过程是有顺序的,如main函数中的语句需要一条一条的按顺序执行,第一条语句没执行完,就不能去执行第二条语句。
可见,单线程编程是有限制的,那就是我们的语句只能串行执行,不可能发生某些语句同时执行的现象。有时我们希望某些代码并行执行,就好比我们一边吃饭,一边看电视。这个时候,就需要使用多线程编程技术了。
需要注意的是:一个程序至少有一个线程,那就是主线程,它对应的方法是main方法。那么,其他线程的创建,就需要借助某一个先前已经存在的线程去创建和引发。这个先前存在的线程可以是主线程的main方法,也可以是被main创建的新的线程。
如下图,主线程中,运行到某个时刻,创建了(至于怎么创建新的线程稍后会讲解)新的线程thread-1,从此,CPU就比以前"忙"起来了,因为它要去执行2个线程总的代码。真的是“同时执行”2个线程的代码吗?答案是否定的。CPU本身是没有所谓的并行执行的能力的,也无所谓多线程,多线程是本机操作系统支持的。操作系统将进程线程进行管理,轮流(没有固定的顺序)分配每个进程很短的一段是时间(不一定是均分)。然后在每个线程内部,程序代码自己处理该进程内部线程的时间分配,多个线程之间相互的切换去执行,这个切换时间也是非常短的。因此多任务、多进程、多线程都是操作系统给人的一种宏观感受,从微观角度看,程序的运行是异步执行的。
我们知道就可以了,关于底层CPU到底如何做,我们并不需要关心。我们关心的是如何通过代码去创建和操作我们的线程。我们就当我们的线程都是“并行执行的”。
2、调用栈
什么是调用栈?在以前单线程编程中,就拿main函数来说吧。以一个列子来说明。
public class Test { public static int Add(int x,int y)
{
return x+y;
} public static void main(String[] args)
{ int x =2,y = 5;
int re = Add(x,y); System.out.println(re); } }
操作系统调用main函数,因为main函数是程序的入口,那么main函数就入栈了,main会占用一定的内存,因为里面有参数args和局部变量x,y,re。当执行到Add函数调用时,这时main函数“挂起”,执行流进入Add函数,Add函数入栈,同样系统也会为Add函数分配临时内存空间,当Add函数执行完,Add函数出栈,返回结果,它占用的内存被回收,执行流再次回到main函数,运行到println函数,println函数入栈。。。。。println出栈,执行流再回到main,main执行完毕,程序结束,系统回收本程序的内存。
注意:这里的栈只是一个操作系统管理函数调用的模型而已,并不是数据结构中的栈,只不够二者的逻辑结构是一致的:FILO。
在多线程编程中,每一个线程都有自己的一个调用栈,来管理自己的函数调用。
3、需要记住的事项
一、线程之间共享内存数据,这使得数据访问更加的快捷,方便。
二、一个使用多线程的程序,如果有任何一个线程没有结束,那么,这个程序就不会结束运行。
三、JVM的线程调度模式采用了抢占式模式。抢占式调度是根据线程的优先级别来获取CPU的使用权。但是这个也并不一定,CPU执行线程的顺序由操作系统和JVM共同
决定。但每一个线程的单次执行时间是一定的,这个时间叫时间片,在Linux系统中,默认时间片为1/100s。
java多线程编程(一基础概念)的更多相关文章
- java多线程编程01---------基本概念
一. java多线程编程基本概念--------基本概念 java多线程可以说是java基础中相对较难的部分,尤其是对于小白,次一系列文章的将会对多线程编程及其原理进行介绍,希望对正在多线程中碰壁的小 ...
- Win32多线程编程(1) — 基础概念篇
内核对象的基本概念 Windows系统是非开源的,它提供给我们的接口是用户模式的,即User-Mode API.当我们调用某个API时,需要从用户模式切换到内核模式的I/O System Serv ...
- Java多线程编程总结一:多线程基本概念
Java多线程编程总结一 – 初识多线程 进程.多进程.线程.多线程的概念 进程(process):CPU的执行路径.通俗的说就是系统中正在运行的程序.比如我们打开了浏览器.QQ等等,这些程序一旦被打 ...
- ★Java多线程编程总结 系列 转
下面是Java线程系列博文的一个编目: Java线程:概念与原理 Java线程:创建与启动 Java线程:线程栈模型与线程的变量 Java线程:线程状态的转换 Java线程:线程的同步与锁 Jav ...
- Java多线程编程详解
转自:http://programming.iteye.com/blog/158568 线程的同步 由于同一进程的多个线程共享同一片存储空间,在带来方便的同时,也带来了访问冲突这个严重的问题.Ja ...
- Java多线程编程总结(精华)
Java多线程编程总结 2007-05-17 11:21:59 标签:多线程 java 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http ...
- (转)Java多线程编程总结
------------------------------------------------------------------------------------------------- ...
- Java多线程编程核心技术
Java多线程编程核心技术 这本书有利于对Java多线程API的理解,但不容易从中总结规律. JDK文档 1. Thread类 部分源码: public class Thread implements ...
- 《Java多线程编程核心技术》推荐
写这篇博客主要是给猿友们推荐一本书<Java多线程编程核心技术>. 之所以要推荐它,主要因为这本书写得十分通俗易懂,以实例贯穿整本书,使得原本抽象的概念,理解起来不再抽象. 只要你有一点点 ...
- Java多线程编程实战读书笔记(一)
多线程的基础概念本人在学习多线程的时候发现一本书——java多线程编程实战指南.整理了一下书中的概念制作成了思维导图的形式.按照书中的章节整理,并添加一些个人的理解.
随机推荐
- .NET中异常处理的最佳实践(转)
原文出处: CodeProject 译文出处:周见智的博客 欢迎分享原创到伯乐头条 介绍 “我的软件程序从来都不会出错”.你们相信吗?我几乎可以肯定所有人都会大喊我是个骗子.“软件程序几乎不可 ...
- jquery概要--基础01
jquery对象,DOM对象 var $cr = $('#cr'); var cr = $cr[0]; /var cr = $cr.get(0); var cr = document ...
- Animator窗口视图Project视图PlayerIdleAnimation和PlayerWalkingAnimation
Animator窗口视图Project视图PlayerIdleAnimation和PlayerWalkingAnimation 通过上一小节的操作,我们新建了2个动画:PlayerIdleAnimat ...
- 转:.NET获取当前方法名或调用此方法的方法名
Introduction Before .NET, we were always looking for a way to log current method name in a log file ...
- BZOJ3290 : Theresa与数据结构
CANCEL操作可以看作删点,X坐标可以离散化 将询问按Z坐标差分,转化成两个求Z<=某个数的和的询问 将操作CDQ分治 每次将前一半的修改.后一半的查询按照Z坐标排序 然后扫描线,每到一个询问 ...
- windows 8 项目
展示图 建议搜索: 线路查询: 应用商店式瀑布浏览(语义缩放): 路线规划:
- HTML5 video 视频标签全属性详解
现在如果要在页面中使用video标签,需要考虑三种情况,支持Ogg Theora或者VP8(如果这玩意儿没出事的话)的(Opera.Mozilla.Chrome),支持H.264的(Safari.IE ...
- python中的list的方法
list1=[1,3,5,"a"]print(dir(list1)) """ ['__add__', '__class__', '__contains ...
- CentOS6.5的openssl升级
CentOS6.5的openssl升级:(修复心脏漏血漏洞) [root@linux1 ~]# rpm -qi openssl|grep VersionVersion : 1.0.1e Vendor: ...
- Linux kernel perf_swevent_init Local root Exploit
64位上编译 另外修改了原Exploit的一个错误 第76行 把 uint64_t *p = (void *) ¤t[i]; 改成 uint64_t *p = (void *) & ...