java进程/线程;堆和栈;多线程
一.进程和线程
进程:在内存中运行的应用程序,一个exe是一个进程。
如:ps -exf 可以查看各个应用的进程,其中ppid为父进程;
ps aux | egrep '(cron|syslog)' 找出与 cron 与 syslog 这两个服务有关的 PID 号码 ;
kill -9 进程id 可以关闭该进程
线程:进程中的一个执行流程,共享同一个进程的内存。
二.堆与栈
堆内存:存放new出来的对象和数组,分出的内存由jvm的自动垃圾回收器进行管理。
栈内存:定义一个变量,取值等于new出来的对象和数组的首地址,即取一个变量名,实际的值存在堆内存中,地址放在定义的变量中,该变量被称为数组或对象的引用变量
(堆保存实际数据,为属性内容,栈保存数值的空间地址,为对象名称)
例如:int[] a=new int a[10] 为堆内存分配一段连续的内存空间
a[2]=4 引用变量相当于给数组起个名字,以后可以引用
内存分配:
1.类变量(static修饰):在堆中分配,堆中的内存地址存放在栈中,方便高速访问
2.实例变量:如 a[2]=4 ,作为堆对象的引用变量,引用完,被GC(garbage collection)垃圾回收器列入可回收的名单,但是不马上释放堆内存
3.局部变量:一般为for循环内定义,执行时在栈中开辟内存,脱离作用域后,内存释放,所以for内的变量一般定义在for内,而不是for外,防止占用内存
具体内存分配参照:http://blog.csdn.net/qh_java/article/details/9084091
三.线程与内存
Thread类实例是一个对象,有变量和方法,生死于堆上
每个线程实例有一个调用栈,每创建一个线程,就产生一个调用栈,记录函数执行顺序,开独立栈是为了并行运行
线程分类:1.用户进程 (main为主线程,其他线程为用户进程)
2.守护进程:程序运行时在后台提供一种通用服务的线程,如:垃圾回收线程,内存管理线程,数据库连接池监控线程
非守护线程结束,则守护线程没有存在的必要,此时jvm退出,守护线程也关闭!!
四.线程的生命周期
线程生命周期的五种状态:
(1)新建(new Thread)
当创建Thread类的一个实例(对象)时,此线程进入新建状态(未被启动)。
例如:Thread t1=new Thread();
(2)就绪(runnable)
线程已经被启动,正在等待被分配给CPU时间片,也就是说此时线程正在就绪队列中排队等候得到CPU资源。例如:t1.start();
(3)运行(running)
线程获得CPU资源正在执行任务(run()方法),此时除非此线程自动放弃CPU资源或者有优先级更高的线程进入,线程将一直运行到结束。
当发生如下情况是,线程会从运行状态变为阻塞状态:
①、线程调用sleep方法主动放弃所占用的系统资源
②、线程调用一个阻塞式IO方法,在该方法返回之前,该线程被阻塞
③、线程试图获得一个同步监视器,但更改同步监视器正被其他线程所持有
④、线程在等待某个通知(notify)
⑤、程序调用了线程的suspend方法将线程挂起。不过该方法容易导致死锁,所以程序应该尽量避免使用该方法。
(4)死亡(dead)
当线程执行完毕或被其它线程杀死,线程就进入死亡状态,这时线程不可能再进入就绪状态等待执行。
自然终止:正常运行run()方法后终止
异常终止:调用stop()方法让一个线程终止运行
(5)堵塞(blocked)
由于某种原因导致正在运行的线程让出CPU并暂停自己的执行,即进入堵塞状态。
正在睡眠:用sleep(long t) 方法可使线程进入睡眠方式。一个睡眠着的线程在指定的时间过去可进入就绪状态。
正在等待:调用wait()方法。(调用motify()方法回到就绪状态)
被另一个线程所阻塞:调用suspend()方法。(调用resume()方法恢复)
状态控制和相关方法见:http://blog.csdn.net/lonelyroamer/article/details/7949969
五.如何创建多线程
多线程实现方式有2种:
(1)继承Thread类(单继承),并重写run方法
(2)实现Runnable接口(当创建的类继承了其他类时)
ps:为什么要单继承,多接口?--》防止继承的多个类中有相同的方法,不易区分,而接口没有方法体(多为抽象方法),可以多继承
先来编写一个单线程:
public class Mythread {
@SuppressWarnings("static-access")
public static void main(String[] args) {
Thread t =Thread.currentThread();
t.setName("单例线程");
System.out.println(t.getName()+" 正在运行");
for(int i=0;i<5;i++){
System.out.println("线程正在休眠:"+i);
try {
t.sleep(500);
} catch (InterruptedException e) {
System.out.println("线程出现错误了!!");
}
} }}
运行结果:
单例线程 正在运行
线程正在休眠:0
线程正在休眠:1
线程正在休眠:2
线程正在休眠:3
线程正在休眠:4
编写一个多线程,使用第一种方法:
package thread; public class Mythread3 extends Thread { private String name;
private int ms; //封装线程名和时间 /*使用类方法,直接赋值类中的类方法,在该类被加载到内存时,就分配了相应的入口地址。
从而类方法不仅可以被类创建的任何对象调用执行,也可以直接通过类名调用。类方法的入口地址直到程序退出才被取消。
类方法在类的字节码加载到内存时就分配了入口地址,因此,Java语言允许通过类名直接调用类方法,而实例方法不能通过类名调用。*/
public Mythread3(String name, int ms) { this.name = name;
this.ms = ms;
} // 每个线程start()后进行run()
@Override
public void run() {
// TODO Auto-generated method stub
try {
sleep(ms); } catch (InterruptedException e) {
// TODO: handle exception
System.out.println("线程出错啦"); }
System.out.println(name+"开始休眠"+ms); } public static void main(String[] args) {
// TODO Auto-generated method stub Thread t1=new Mythread3("线程1",100);
Thread t2=new Mythread3("线程2",300);
Thread t3=new Mythread3("线程3",200);
t1.start();
t2.start();
t3.start();
}
}
运行结果:
线程1开始休眠100
线程3开始休眠200
线程2开始休眠300
使用第二种方法:
package thread; class MyThread extends Thread{
public int x = 0;
public void run(){
System.out.println(++x);
}
} class R implements Runnable{
private int x = 0;
public void run(){
System.out.println(++x);
}
} public class Test{
public static void main(String[] args){ try {
for(int i=0;i<10;i++){
Thread t = new MyThread(); //Mythread类继承thread,使用方法(1),打印十次1
t.start();
} Thread.sleep(10000);//让上面的线程运行完成 /*R类使用接口runnable,使用方法(2),10个线程对象产生的10个线程运行时打印了1到10。
10个线程称为同一实例(Runnable实例)的多个线程。*/
R r = new R();
for(int i=0;i<10;i++){
Thread t1 = new Thread(r);
t1.start();
}
} catch (Exception e) {
// TODO: handle exception
}
}
}
运行结果:
六.线程同步
临界资源:多个线程共享的数据
java对象默认可以被多个线程共用,当用sychronized修饰时,则启动“互斥锁”机制,任一时刻只能由一个线程访问,即使该线程阻塞。
线程同步的方法有两种:
(1)synchronized(互斥锁)
(2)wait与notify
可见: http://blog.csdn.net/ff55c/article/details/6748604
java进程/线程;堆和栈;多线程的更多相关文章
- java中的堆与栈
Java 中的堆和栈 Java把内存划分成两种:一种是栈内存,一种是堆内存. 在函数中定义的一些基本类型的变量和对象的引用变量都在函数的栈内存中分配 . 当在一段代码块定义一个变量时,Java就在栈中 ...
- Java中的堆和栈
Java中的堆和栈 栈内存 存放基本数据类型和引用变量 堆内存 存放运行时创建的对象 一般来说,通过new关键字创建出来的对象都放在堆内存中 由于JVM是基于堆栈的虚拟机,而每个Java程序都运行在一 ...
- Java中线程的使用 (2)-多线程、线程优先级、线程睡眠、让步、阻塞
Java中线程的使用 (2)-多线程.线程优先级.线程睡眠.让步.阻塞 (一)多线程使用方法 说明:创建每个新的线程,一定要记得启动每个新的线程(调用.start()方法) class Xc3 ext ...
- Java进程&线程(整理)
Java进程&线程 程序:程序员写的代码,就是代码,不运行好像不会发生什么: 进程:一个进程可以理解为"运行的"一个程序,当我们启动一个java程序后,对应的jvm就会创建 ...
- Java进程&线程(一)
Java进程&线程 程序:程序员写的代码,就是代码,不运行好像不会发生什么: 进程:一个进程可以理解为"运行的"一个程序,当我们启动一个java程序后,对应的jvm就会创建 ...
- Linux程序存储结构与进程结构堆和栈的区别【转】
转自:http://www.hongkevip.com/caozuoxitong/Unix_Linux/24581.html 红客VIP(http://www.hongkevip.com):Linux ...
- java中的堆、栈、常量池
java中的堆.栈.常量池 分类: java2010-01-15 03:03 4248人阅读 评论(5) 收藏 举报 javastring编译器jvm存储equals Java内存分配: 1. 寄存器 ...
- 【Java】PS-查看Java进程-线程数
PS-查看Java进程-线程数 ps 线程 个数_百度搜索 查看进程的线程数命令 - CSDN博客 java命令行运行jar里的main类 - coderland - 博客园
- Android内存管理(11)*常见JVM回收机制「Java进程内存堆分代,JVM分代回收内存,三种垃圾回收器」
参考: http://www.blogjava.net/rosen/archive/2010/05/21/321575.html 1,Java进程内存堆分代: 典型的JVM根据generation(代 ...
随机推荐
- Nginx也应用场景小结
Nginx简介 Nginx一是一款轻量级的.高性能的HTTP和反向代理服务器, 具有很高的稳定性和支持热部署.模块扩展也很容易.当遇到访问的峰值,或者有人恶意发起慢速连接时,也很可能会导致服务器 ...
- Android上传图片到服务器,服务端利用.NET WCFRest服务读取文件的解决方案
在项目中遇到要将Android设备拍摄的照片上传的服务器,将文件保存在服务器本地的文件夹中,数据库中保存的是图片文件名.整个上传是将图片生成二进制流通过HTTP请求上传到服务端,服务端是基于.NET环 ...
- koa2 controller中实现类似sleep的延迟功能
今天有同事问我如何在koa2中的controller中使用延迟执行的功能,他直接在controller中使用setTimeout,但是没效果. 错误的代码类似下面这样: // 错误的方法 export ...
- 让 SVN (TortoiseSVN)提交时忽略指定目录
2013-06-23 更新 后来我使用属性来过滤,结果反而没有效果了,之后我再次尝试使用全局忽略样式设置:*/bin */obj */packages 结果又有效果了,奇怪了. ------- 由于我 ...
- SQL实现 模糊查询(转)
在进行数据库查询时,有完整查询和模糊查询之分. 一般模糊查询语句如下: SELECT 字段 FROM 表 WHERE 某字段 Like 条件 其中关于条件,SQL提供了四种匹配模式: 1,% :表示任 ...
- install redis
1.Office Download redis.tar.gz from website --- redis.io 2.uncompact file $ tar zxvf redis-3.2.9.ta ...
- Java面向对象的理解
Java是一门面向对象的编程语言(Object Oriented Programming,OOP), 这个句话是每个学习Java的程序员应该先深刻理解的一句话. 我们之所以将自自然界分解,组织成各种概 ...
- 通过 PHP 连接China Azure Blob 存储
问题说明 Azure Blob 存储是一种将非结构化数据作为对象/Blob存储在云中的服务.Blob存储可以存储任何类型的文本或二进制数据,例如文档.媒体文件或应用程序安装程序.Blob存储也称为对象 ...
- hdu 6107--Typesetting(倍增)
题目链接 Problem Description Yellowstar is writing an article that contains N words and 1 picture, and t ...
- 数据结构之合并链表STL
#include <iostream> #include <list> using namespace std; int main() { int n, m; while (c ...