线程就是程序内部的控制流程。
如下图:
1.创建状态:创建一个新的线程对象(new Thread)。
2.就绪状态:Java通过start方法启动处于新建状态的线程对象,进入就绪状态。处于就绪状态的线程已经具备了执行资格,将进入线程队列等待系统为其分配CPU,一旦获得了CPU,线程就进入运行状态,并调用自己的run方法。
3.运行状态:处于就绪状态的线程被调度并获得CPU资源后即迚运行状态,每一个Thread类及其子类的对象都有一个run()方法,当线程对象被调度执行的时候,它将自劢调用本对象的run()方法。
4.阻塞状态:一个正在执行的线程如果在某些特殊情况下,如被人为挂起戒它的CPU时间片耗尽时,将让出CPU并暂时中止自己的执行,迚入阻塞状态。阻塞时它丌能迚入排列队列,只有当引起阻塞的原因被消除时,线程才可以转入就绪状态,重新迚到线程队列中排队等待CPU资源,以便从原来终止处开始继续执行。
5.终止状态:当线程的运行代码全部执行完毕时,线程就迚入终止状态,当我们执行Java线程对象的stop()方法后线也迚入终止状态。CPU再也丌会为该线程分配执行时间了。
1.进程每个程序都至少有一个进程,每个进程中都至少有一个线程。
2.线程是进程的一个实体。
3.进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位。线程自己基本上不拥有系统资源。
4.一个线程可以创建和撤销另一个线程;同一个进程中的多个线程之间可以并发执行
TIPS:直白地说,线程就是程序的执行路径。进程就是来管理这些进程的(线程需要资源需要从进程获取)。
三、JAVA线程的启动:
1.JAVA程序启动时,会有一个由主方法(main)来定义的线程。这个线程帮助我们的程序依据主函数中的语句顺序执行代码。
2.我们可以通过java.lang.Thread或者java.lang.Runnable来启动一个线程。
<span style="font-family:Arial;font-size:18px;">class PrimeThread extends Thread {
long minPrime;
//构造方法
PrimeThread(long minPrime) {
this.minPrime = minPrime;
}
//run方法
public void run() {
. . .
}
}
调用:
PrimeThread p = new PrimeThread(143);
p.start();</span>
<span style="font-family:Arial;font-size:18px;">class PrimeRun implements Runnable {
long minPrime;
//构造方法
PrimeRun(long minPrime) {
this.minPrime = minPrime;
}
//run方法
public void run() {
. . .
}
}
调用:
PrimeRun p = new PrimeRun(143);
new Thread(p).start();</span>
四、常用线程控制方法:
1)isAlive(),线程是否还在运行.
2)getPriority(),获取当前线程优先级
3)setPriority(),线程优先级设置,值在10-1之间。
4)sleep(),休眠,指定的时间是(毫秒)或者(毫秒,纳秒)
5)join(),等待指定线程执行完毕。(相当于与执行线程合并)
6)yield(),让出cpu,暂停当前正在执行的线程对象,并执行其他线程start(), 使该线程开始执行;Java 虚拟机调用该线程的 run 方法。
五、线程同步
(1)wait():使一个线程处于等待状态,并且释放所持有的对象的lock。
(2)sleep():使一个正在运行的线程处于睡眠状态,是一个静态方法,调用此方法要捕捉 InterruptedException异常。(3)notify():唤醒一个处于等待状态的线程,注意的是在调用此方法的时候,并不能确切的 唤醒某一个等待状态的线程,而是由JVM确定唤醒哪个线程,而且不是按优先级。
(4)notityAll ():唤醒所有处入等待状态的线程,注意并不是给所有唤醒线程一个对象的锁.
六、Wait与Sleep的区别:
wait 时,别的线程可以访问锁定对象调用,wait方法的时候必须锁定该对象
sleep时,别的线程也不可以访问锁定对象而是让它们竞争
七、synchronized关键字
1. synchronized 方法:在方法声明中加入 synchronized关键字来声明 synchronized 方法
好处:声明为 synchronized 的成员函数中至多只有一个处于可执行状态,避免房屋内冲突
2. synchronized 块:通过 synchronized关键字来声明synchronized 块。
好处:对任意代码块,可任意指定上锁的对象,灵活性较高。
部分代码如下:
<span style="font-family:Arial;font-size:18px;">class Bank {
int money = 3000;
public void getMoney(String name, int money) {
synchronized (this) {
if (this.money >= money) {
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
this.money -= money;
System.out.println(name + "取出" + money + ",剩余:" + this.money);
} else {
System.out.println("余额不足!");
}
}
}
}</span>