java多线程笔记

来源:互联网 发布:java中类似于c action 编辑:程序博客网 时间:2024/05/19 16:06

多线程指的是在单个程序中可以同时运行多个同的线程执行不同的任务


线程是程序内的顺序控制流,只能使用分配给的资源和环境 

进程与线程的区别:

多个进程的内部数据和状态都是完全独立的,而多线程是共享一块内存空间和一组系统资源,有可以互相影响。

线程本身的数据通常只有寄存器数据,以及一个程序执行时使用的堆栈。所以线程的切换比进程切换的负担小

多线程的目的,最大限度的利用CPU资源
主线程:main线程

进程:执行中的程序

java中编写线程类

继承Thread或实现Runnable


start首先为线程的执行准备好系统资源,然后去调用 run方法


一个进程至少要包含一个线程


对于单核CPU,某一时刻只能有一个线程在执行,微观串行。


当生成一个线程对象时,没有为其设定名字,那么线程对象 的名字。则使用如下 形式:Thread-number。该number自动增加


线程的生命周期
创建状态--可运行状态Runnable--不可运行状态--返回可运行状态--消亡状态


停止线程的方式:不能使用Thread类的stop方法来终止线程的执行。
一般设定一个变量,在run方法中是一个循环,循环每次检查该变量,如果满足条件则继续执行,否则跳出,线程结束 


不能依靠线程的优先级来决定线程的执行顺序



java多线程为了避免多线程并发
解决多线程共享数据同步问题提供了synchornized
被修饰的方法叫同步方法


java中的每个对象都 有一个锁lock或者叫监视器monitor

当访问某个对象的synchronized方法时,表示将该对象上锁,此时其他任何线程都无法再去访问该 synchronized方法。

直到之前的那个线程执行方法完毕后

那么将该对象的锁释放掉,其他线程才有可能再去访问该 synchronized方法


如果一个对象有多个同步方法。某一时刻某个线程进入了某个同步方法。那在该方法没有执行完毕前,其他线程是无法访问该对象的任何同步方法
 

 如果某个synchronized方法是static,那当线程访问该方法时,它锁上的并不是synchronized方法所在的对象,

而是synchronized方法所在的对象所对应的 Class对象,因为java中无论一个类有多少个对象,这些对象会对应唯一一个Class对象

 
 synchronized块
 synchronized(object){}表示线程在执行的时候,会对object对象上锁
 
 wait与notify方法都是定义在object类中,而且是final的,因此会被
所有的java类所继承而无法重写。

这两个方法要求在调用线程应该已经获得了对象的锁

 因此对这两个方法的调用需要放在Synchronized方法或块中。当线程执行了wait方法时,它会释放掉对象的锁
 
 线程在睡眠的过程是不会释放掉对象的锁
 

 notify唤醒在此对象监视器上等待的单个线程。如果所有线程都在此对象上等待,则会选择唤醒其中一个线程。

选择是任意性

 被唤醒的线程将会以常规方式与在该对象上主动同步的其他所有线程进行竞争
 
 死锁,线程一锁住了对象A的监视器,等待对象B的监视器。线程2锁住了对象B
 的监视器,等待对象A的监视器,造成了死锁
 
 所有对象都有锁,线程可通过synchronized来获得锁
原创粉丝点击