在我们日常使用的应用程序中,不同的程序块是可以同时运行的,这种多个程序块同时运行的现象称作并发执行。多线程是指一个应用程序中有多条并发执行的线索,每条线索都被称作一个线程,它们会交替执行,彼此间可进行通信。
本文将对Java多线程的一些基础知识进行介绍!
在一个操作系统中,每个独立执行的程序都可称为一个进程,也就是“正在运行的程序”。
进程并不是同时运行的,是因为CPU能在极短的时间内在不同的进程之间进行切换,看起来像是在同时运行。
在一个进程中,可以有多个执行单元同时运行,这些执行单元可以看作程序执行的一条条线索,被称为线程。
同进程一样,由CPU轮流执行,并不是同时执行的。
public class Example01 {
public static void main(String[] args) {
MyThread myThread = new MyThread(); //创建线程MyThread的线程对象
myThread.start(); //开启线程
while (true) {
//通过死循环打印输出语句
System.out.println("main()方法在运行");
}
}
}
class MyThread extends Thread{
@Override
public void run() {
while (true){
//通过死循环语句打印输出
System.out.println("MyThread类的run()方法在运行");
}
}
}
public class Example02 {
public static void main(String[] args) {
MyThread myThread = new MyThread(); //创建MyThread的实例对象
Thread thread = new Thread(myThread); //创建线程对象
thread.start(); //开启线程,执行线程中的run()方法
while (true){
System.out.println("main()方法在运行");
}
}
}
class MyThread implements Runnable{
@Override
public void run() {
//线程的代码段,调用start()方法时,线程从此处开始执行
while (true){
System.out.println("MyThread类的run()方法在运行");
}
}
}
创建线程对象后,该线程对象就处于新建状态;
此时不能运行,仅仅由Java虚拟机为它分配了内存。
当线程对象调用了 start() 方法 后,该线程就进入了就绪状态;(又称,可运行状态)
此时的线程位于可运行池中,等待着系统的调度。
当处于就绪状态的线程获得了CPU使用权,开始执行 run() 方法中的线程执行体,则该线程处于运行状态;
只有处于就绪状态的线程才可能转换到运行状态。
当正在执行的线程在某些情况下,会放弃CPU的使用权,进入阻塞状态;
线程从阻塞状态只能进入就绪状态,不能直接进入运行状态;
结束阻塞状态的线程,需要重新进入可运行池中,等待系统的调度。
run() 方法执行完毕;
未捕获的异常 Exception;
错误 Error。
平均分配每个线程占用的CPU的时间片
让优先级高的线程有限占用CPU,优先级相同的随机选择一个占用。
用1-10之间的整数表示,数字越大,优先级越高。
Thread类的静态常量 | 功能描述 |
---|---|
static int MAX_PRIORITY | 最高优先级,10 |
staitc int MIN_PRIORITY | 最低优先级,1 |
static int NORM_PRIORITY | 普通优先级,5 |
synchronized(lock){
操作共享资源代码块
}
lock: 锁对象
解析:
1.当线程执行同步代码块时,首先检查锁对象的标志位,默认情况下标志位为1,此时线程会执行同步代码块,同时将锁对象的标志位置为0。
2.当一个新的线程执行到这段同步代码块时,由于锁对象的标志位为0,新线程会发生阻塞,等待当前线程执行完同步代码块后,锁对象的标志位被置为1,县线程才能进入同步代码块执行其中的代码。
3.重复过程,直到共享资源被处理完为止。
线程在执行同步代码时每次都会判断锁的状态,非常消耗资源,效率较低。
synchronized 返回值类型 方法名([参数1,……]) {
}
两个线程都需要对方所占用的锁,但都无法释放自己所拥有的锁,于是这两个线程都处于了挂起的状态,从而造成死锁。
以上就是Java多线程的介绍啦,欢迎交流~共同进步!
附上导图: