java之进程理解

本文详细介绍了死锁的概念及产生的原因,并深入探讨了多线程编程的基础知识,包括线程的创建方式、状态管理和同步机制等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

所谓死锁: 是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。
    
那么为什么会产生死锁呢?
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);
        }
    }
}

   



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值