java之进程理解
2015-08-08 15:39
375 查看
所谓死锁: 是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。 那么为什么会产生死锁呢? 1.因为系统资源不足。 2.进程运行推进的顺序不合适。 3.资源分配不当。 学过操作系统的朋友都知道:产生死锁的条件有四个: 1.互斥条件:所谓互斥就是进程在某一时间内独占资源。 2.请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。 3.不剥夺条件:进程已获得资源,在末使用完之前,不能强行剥夺。 4.循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。 package com.aweiyo.duoxiancheng; public class Thread { /** * 进程:是一个正在执行的程序 每一个进程执行都有一个执行顺序.该顺序是一个执行路径,或者叫一个控制单元. * 线程:就是进程中的一个独立的控制单元.线程就是控制着进程的执行 * 一个线程中至少是有一个线程 * * Java VM 启动的时候会有意个java.exe * * 该进程中至少一个线程负责java程序的执行.而且这个线程运行的代码存在于main方法中 * * jvm启动不止一个线程,还有负责垃圾回收机制的线程 * * 多线程存在的意义: * 线程的创建方式: * 1.继承Thread类 定义类继承Thread,复写run方法 * (多个线程都获得cpu的执行权,单核的情况下每一时刻只能有一个线程运行.cup做快速的转换,所以就可以看上去是同时执行的效果, 这就是多线程的随机性) * 2.定义类,实现runnable接口,翻盖接口中的run方法.将runnable接口的子类对象作为实际参数传递给Thread类的构造函数.(因为自定义的run方法所处的对象是runnable接口的子类的对象, * 所以要让子线程指定指定对象的run方法,就必须将子类的对象传给Threa的构造函数,从而明确了run方法所属的对象)调用Thread的start方法开启新的线程. * 为什么要继承Thread类,覆盖run方法? * run方法是封装线程运行的代码,start开启后就执行了一个线程.而该线程要执行的代码就是封装在run里面. * 如果单独调用run,也就是相当于普通的一个方法.虽然他是封装了线程运行的代码,但是没有start把线程启动,单独的run是不能启动线程的,所以就相当与是一个普通的方法. * 如果单独的额调用start方法,也就是相当于一个开启了一个新的线程,但是毫无意义.为什么呢,因为他开启的线程没有执行的代码啊,就是开了一个空线程,但是没有实现而已. * * 继承Thread和Runnable的区别? * 实现方式的好处:避免了单线程的局限性 * 继承Thread:线程代码存放Thread子类的run方法中 * 实现Runnable:线程代码存放在接口的子类的run方法中 * 线程的几种状态创建、就绪、运行、阻塞和死亡。 * 创建: * 运行: * 就绪:已经开启了线程,暂时没有获得执行权 * 阻塞:被sleep,或是wait阻塞了 * 死亡:run方法执行完毕,或是调用了stop方法 * * static Thread currentThread():获取当先正在执行的线程 * 局部的代码在每一个线程里面都会开启一个新的空间存放代码 * * * 买票问题的分析: * 当多条语句在操作同一线程共享数据时,一个线程对多条语句只执行了一部分,还没有执行完,另一个线程参与进来执行,导致数据共享错误 * 解决办法:对多条操作共享数据的语句,只能在某个阶段让一个线程执行完,执行过程中,别的线程没有分配执行权(同步代码块) * synchronized(对象){ * } * 对象如同锁,持有锁的线程可以在同步中进行. * 没有持有锁的线程即使获取了了cpu的执行权,也进不去,因为没有获取锁 * 同步的前提: * 1.必须要有两个或是两个以上的线程 * 2.必须是多个线程使用同一个锁 * 同步的好处: * 1.解决多线程的安全问题(安全问题是指:如果多个线程同时的执行,那么可能一个线程没有执行完,别的线程就抢夺了cpu的执行权,从而打断了该线程的执行) * 2.弊端:多个线程都需要判断锁,消耗资源 * 同步函数的锁是this,如果同步函数被静态的修饰,同步的锁肯定就不是this了.(使用的锁是该方法所在类的字节码文件对象.即类名.class) * * @param args */ public static void main(String[] args) { Thread test=new Test(); //test.run.s for(int i=0;i<=10;i++){ System.out.println(i); } } } class Test extends Thread { public void run() { for (int i = 0; i <= 10; i++) { System.out.println("Test" + i); } } }
相关文章推荐
- Java程序运行机制及运行过程
- 深入浅出Java回调机制
- JAVA String常见问题
- MyEclipse10 安装
- Java--装箱,拆箱
- Java--枚举
- java中使用MD5进行加密
- 关于Spring MVC中的表单标签库的使用
- Java注解教程:自定义注解示例,利用反射进行解析
- Spring-MVC jsp导入excel到数据库
- 黑马程序员---struts2学习笔记之八(ognl原理及使用)
- springmvc 集合类型绑定
- JAVA 注解的几大作用及使用方法详解
- 黑马程序员---struts2学习笔记之七(表单验证)
- Java泛型总结(1)
- JAVA 阻塞队列
- 黑马程序员---struts2学习笔记之六(自定义拦截器)
- 常用的Eclipse快捷键
- [JavaSecurity] - AES Encryption
- springmvc 全局异常解决方案