进程:
独立性:进程是系统中独立存在的实体。可以有自己的资源,每个进程都拥有自己私有的地址空间,没有经过进程本身允许,一个用户进程不能访问其他进程空间
动态性:程序是一个静态指令集合,进程是一个正在系统中活动的指令集和,在进程中加入时间概念,进程有自己的生命周期和各种不同的状态
并发性:多个进程可以再耽搁处理器上并发执行,多个进城之间不会相互影响
并发:同一时刻只有一条指令执行,多条指令被快速轮换执行
并行:同一时刻,多条指令在多个处理器上同时执行
线程:线程是进程的执行单元。线程在程序中,是独立并发的执行流。进程被初始化后,主线程就被创建。一个进程可以拥有多个线程,一个线程必须有一个父进程,
线程可以有自己的堆栈,自己的程序计数器和自己的局部变量,但是不再拥有系统资源,与父进程的其他线程共享该进程拥有的全部资源。
同一进程中的线程可以并发执行
多线程编程优点: 进程间不能共享内存,线程中共享内存很容易
系统创建进程需要为进程重新分配资源,创建线程代价小,实现多任务并发效率高
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()唤醒所有线程
本文详细介绍了进程与线程的概念,包括它们的特性、并发执行和线程同步。进程作为系统中独立存在的实体,拥有私有地址空间;线程作为进程的执行单元,共享进程资源,能实现更高效的并发。多线程编程具有资源分享容易、创建成本低等优点,并在Java中得到支持。线程生命周期包括新建、就绪、运行、阻塞和死亡状态。同步方法通过`synchronized`关键字实现,线程间的协调可通过`wait()`, `notify()`和`notifyAll()`方法进行控制。"
121890970,7466189,JDK8并行Stream流效率与线程安全解析,"['java', '多线程', 'Stream', '并行处理']

被折叠的 条评论
为什么被折叠?



