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
原创粉丝点击