java之进程理解
来源:互联网 发布:java如何一行输出 编辑:程序博客网 时间:2024/05/21 11:30
所谓死锁: 是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。 那么为什么会产生死锁呢?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); } }}
0 0
- java之进程理解
- Linux之守护进程理解
- java之进程
- Linux之守护进程理解(2)
- 深入理解LINUX 内核 之 进程学习
- 多线程之进程与线程的理解
- 深入理解进程间通信之信号
- 进程、线程、协程之概念理解
- java中对进程,多线程入门理解
- java 进程和线程的理解
- 理解JAVA的进程和线程
- Java之小理解
- Java接口之理解
- java之架构理解
- java技术之进程---process
- Java 多线程之-----守护进程
- Java 之 线程和进程
- Java之进程与线程
- 仿新版QQ锁屏下弹窗
- Codeforces Round #Pi (Div. 2)
- LTE中的上行参考信号
- cocos2dx-音乐音效
- 1426POJ
- java之进程理解
- 直接依赖,间接依赖,可选依赖,排除依赖,依赖冲突
- 多数据加载相关专利研究
- 使用JavaMail连接带有TLS的SMTP
- app后端设计-- 项目管理
- 取石子游戏(hdu2516+FIB博弈)
- 2015多校训练5题解与代码
- 南邮 OJ 2068 爱魔法的露露
- fread函数和read函数的区别