进程与线程相关

本文详细介绍了进程与线程的概念,包括它们的特性、并发执行和线程同步。进程作为系统中独立存在的实体,拥有私有地址空间;线程作为进程的执行单元,共享进程资源,能实现更高效的并发。多线程编程具有资源分享容易、创建成本低等优点,并在Java中得到支持。线程生命周期包括新建、就绪、运行、阻塞和死亡状态。同步方法通过`synchronized`关键字实现,线程间的协调可通过`wait()`, `notify()`和`notifyAll()`方法进行控制。" 121890970,7466189,JDK8并行Stream流效率与线程安全解析,"['java', '多线程', 'Stream', '并行处理']

进程:
    独立性:进程是系统中独立存在的实体。可以有自己的资源,每个进程都拥有自己私有的地址空间,没有经过进程本身允许,一个用户进程不能访问其他进程空间
    动态性:程序是一个静态指令集合,进程是一个正在系统中活动的指令集和,在进程中加入时间概念,进程有自己的生命周期和各种不同的状态
    并发性:多个进程可以再耽搁处理器上并发执行,多个进城之间不会相互影响

并发:同一时刻只有一条指令执行,多条指令被快速轮换执行
并行:同一时刻,多条指令在多个处理器上同时执行

线程:线程是进程的执行单元。线程在程序中,是独立并发的执行流。进程被初始化后,主线程就被创建。一个进程可以拥有多个线程,一个线程必须有一个父进程,
     线程可以有自己的堆栈,自己的程序计数器和自己的局部变量,但是不再拥有系统资源,与父进程的其他线程共享该进程拥有的全部资源。
     同一进程中的线程可以并发执行
     
多线程编程优点: 进程间不能共享内存,线程中共享内存很容易
                系统创建进程需要为进程重新分配资源,创建线程代价小,实现多任务并发效率高
                java内置多线程功能支持,

启动线程使用start方法,不是run方法,调用start方法,系统吧run方法当做线程执行体处理,如果调用run方法,,run方法会立即执行
run方法返回之前其他线程无法并发执行,

Runnable:
        线程类实现了Runnable接口,还可以继承其他类
        多个线程共享一个target对象,适合多个相同线程处理同一份资源,可以将    CPU,代码,数据分开,形成清晰模型,体现面向对象
        劣势:编程复杂,需要访问当前线程,必须使用功能Thread.currentThread()方法
Thread: 
        劣势:已经继承Thread类,不能再继承其他类
        优势:编写简单,如:需要访问当前线程,直接this
        
线程生命周期: 新建(New) 就绪(Runnable) 运行(Running) 阻塞(Blocked) 死亡(Dead)

新建:new之后,jvm分配了内存,初始化成员变量,但是这个对象没有任何线程动态特性,程序不会执行线程的线程执行体

就绪:对象调用了start()方法之后,为其创建方法调用栈和程序计数器,但是没有运行,只是表示可以运行

运行:就绪状态的线程获得CPU,开始执行run方法的线程执行体,为运行状态,如果只有一个CPU,在任何时刻只有一条线程运行状态

阻塞:线程不可能一直处于运行状态,
    线程调用sleep方法主动放弃所占用的处理器资源
    线程调用阻塞IO方法,在方法返回之前,线程被阻塞
    线程试图获得一个同步监视器,但是这个同步监视器被其他线程所有,
    线程正在等待通知(notify)
    程序调用线程的suspend方法将线程挂起,但是容易死锁

令阻塞进入就绪状态:
                调用的sleep方法的线程经过了指定的时间
                线程调用的阻塞io方法已经返回
                线程成功获得了试图得到的监视器
                线程正在等待摸个通知,其他线程发出了通知
                处于挂起的线程被调用了resume方法3
            
死亡:run()方法执行完毕,线程正常结束
    线程抛出一个未捕获的Exception或者是error
    直接调用线程的stop()方法结束线程,这个方法容易导致死锁
    

join线程:Thread提供让一个线程等待另一个完成的方法,当调用其他线程的jion方法,调用线程被阻塞,知道被join方法加入的join线程完成

yield:线程让步  可以让当前正在执行的线程暂停,但是不会阻塞线程,将线程转入就绪状态
        当某个线程调用了yield方法暂停后,只有优先级与当前线程相同,或者是优先级比当前线程更高的线程才会获得执行机会

sleep与yield方法的区别:
                    sleep暂停当前线程后,回给其他线程执行机会,yield只会给优先级相同或者是更高级的线程
                    sleep会将线程转入阻塞状态,之后进入就绪状态,yield会将线程进入就绪状态,
                    sleep方法抛出InterruptedException异常,调用sleep需要捕捉异常
                    sleep有更好的可移植性
        
同步方法:synchronized修饰的方法,无需指定同步监视器,同步方法的同步监视器是this
        使用同步方法的类是线程安全的类,该类的对象可以被多个线程安全访问,
        每个线程调用该对象的任一方法都将得到正确结果
        每个线程调用该对象的任一方法,该对象状态依然保持合理性
线程释放同步监视器的锁定: 当前线程的同步方法,同步代码块执行结束,当前线程释放同步监视器
                        线程在同步代码块,同步方法中遇到break return终止代码块,方法的继续执行,当前线程释放同步监视器
                        线程在同步代码块,同步方法中遇到未处理的error 或exception ,导致代码块,方法异常结束
                        线程在执行同步代码块,同步方法时程序执行了同步监视器的wait()方法,当前线程暂停,线程释放同步监视器
                        
线程不会释放同步监视器的锁定: 线程在执行同步代码块,同步方法时,程序调用了Thread.sleep()Thread.yield ()方法来暂停当前线程的执行
                            线程执行同步代码块时,其他线程调用了该线程的suspend方法将该线程挂起,不会释放        
                            
线程的协调运行:Object中的wait()notity()notityAll()方法,
            对应使用synchronized修饰的同步方法,因为该类的默认实例(this)是同步监视器,所以可以直接在同步方法中调用
            对于使用synchronized修饰的同步代码块,同步监视器,是synchronized后的对象,所以必须使用对象调用
            
    wait()当前线程等待,知道其他线程调用该同步监视器的notify()方法或notifyAll()方法唤醒线程。调用wait方法的当前线程会释放对同步监视器的锁定
    notify()唤醒在此同步监视器上等待的单个线程,如果所有线程都在此同步监视器上等待,会选择唤醒其中一个线程,
    notifyAll()唤醒在此同步监视器上等待的所有线程,只有当前线程放弃对该同步监视器的锁定后,才可以执行被唤醒的线程
    

使用条件变量控制协调
            Conditon类:lock.newCondition()
            await():使线程等待,知道其他线程调用该Condition的signal()方法,或signalAll()方法,
            signal()唤醒Lock对象上等待的单个线程
            signalAll()唤醒所有线程
            

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值