您的位置:首页 > 编程语言 > Java开发

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);
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: