作者:中国有程序猿 | 来源:互联网 | 2023-08-22 17:28
一.基础知识
1.线程与进程
进程:进程是程序关于某项操作的一次运行活动,是操作系统进行资源调度和分配的单位。进程是线程的集合。
线程:线程是进程的一条执行路径,是cpu进行调度和分配的单位。
举例:进程就像是一个工厂,完成着cpu分配的任务,同一时刻只能有一条线程在执行,线程就好比是工厂的工人,许多工人同时完成任务。
2.什么是多线程
在同一时刻,有多条执行路径,多线程的目的是提高程序的运行效率。
3.多线程使用场景
迅雷下载、数据库连接池、分批发送短信。
4.多线程的创建方式
(1)继承Thread,重写run方法。
package com.zhu.mayi.thread_demo;/*** Hello world!**///1.什么是线程?线程是进程的一条执行路径
//2.什么是多线程?多线程是在一个进程中,多条线程并发执行
//3.在一个进程中,一定会有主线程
//4.线程分为:主线程、子线程、GC线程、用户线程、守护线程
//多线程的实现方式&#xff1f; 1.继承thread类重写run方法 2.实现runnable接口 3.利用匿名内部类方式 4.使用线程池//1.继承thread类重写run方法class test extends Thread{&#64;Overridepublic void run() {for(int i &#61; 0;i<10;i&#43;&#43;){System.out.println("chird:i&#61;"&#43;i);}}}public class threagTest1
{public static void main( String[] args ){System.out.println("主线程开始");test test1 &#61; new test();test1.start();for(int i &#61; 0;i<10;i&#43;&#43;){System.out.println("main:i&#61;"&#43;i);}System.out.println("主线程结束");}
}
&#xff08;2&#xff09;实现runnable接口。
package com.zhu.mayi.thread_demo;class test2 implements Runnable{public void run() {for(int i &#61; 0;i <10;i&#43;&#43;){System.out.println("i&#61;"&#43;i);}}}//实现Runnable接口&#xff0c;重写run方法
/*** &#64;author johson**/
public class threadTest2 {public static void main(String[] args){System.out.println("主线程开始");test2 test &#61; new test2();Thread thread &#61; new Thread(test);thread.start();for(int j &#61; 0;j <10;j&#43;&#43;){System.out.println("j&#61;"&#43;j);}System.out.println("主线程结束");}}
&#xff08;3&#xff09;使用匿名内部类。
package com.zhu.mayi.thread_demo;public class threadTest3 {//使用内部类方式public static void main(String[] args){System.out.println("主线程开始");Thread thread &#61; new Thread(new Runnable() {public void run() {for(int i &#61; 0;i <10;i&#43;&#43;){System.out.println("i&#61;" &#43; i);}}});thread.start();for(int j &#61; 0;j <10;j&#43;&#43;){System.out.println("j&#61;" &#43; j);}System.out.println("主线程结束");}}
&#xff08;4&#xff09;实现Callable接口。
未作实现
5.多线程的五种状态
&#xff08;1&#xff09;新建状态&#xff1a;线程刚被创建的时候&#xff0c;使用new关键字创建线程——new Thread(t)&#xff0c;此时线程的代码还未执行。
&#xff08;2&#xff09;就绪状态&#xff1a;线程新建后&#xff0c;需要通过start()方法去执行。start()方法创建线程运行的系统资源&#xff0c;线程就进入了就绪状态。也就是说&#xff0c;就绪状态就是在线程创建后&#xff0c;获得cpu时间执行run()方法之前。
&#xff08;3&#xff09;运行状态&#xff1a;获得CPU时间后&#xff0c;它才进入运行状态&#xff0c;开始执行run()方法。
&#xff08;4&#xff09;阻塞状态&#xff1a;阻塞状态有以下几种情况&#xff1a;
a.线程调用了sleep()方法进入睡眠状态。
b.线程试图获取一个锁&#xff0c;但是这个锁正被其他线程占用&#xff0c;还未释放。
c.线程正在等待某个触发条件。
&#xff08;5&#xff09;死亡状态&#xff1a;死亡状态可能有以下原因造成&#xff1a;
a.run()方法正常执行完毕
b.程序发生异常&#xff0c;造成run()方法结束
为了确定线程在当前是否存活着&#xff08;就是要么是可运行的&#xff0c;要么是被阻塞了&#xff09;&#xff0c;需要使用isAlive方法。如果是可运行或被阻塞&#xff0c;这个方法返回true&#xff1b; 如果线程仍旧是new状态且不是可运行的&#xff0c; 或者线程死亡了&#xff0c;则返回false。
6.多线程的几种方法
a.join()方法
将执行权交给另一个线程。例如当在主线程当中执行到t1.join()方法时&#xff0c;就认为主线程应该把执行权让给t1。
b.Yield方法
Thread.yield()方法的作用&#xff1a;暂停当前正在执行的线程&#xff0c;并执行其他线程。&#xff08;可能没有效果)
c.wait、notify方法
wait()暂定当前正在执行的线程,并释放资源锁,让其他线程可以有机会运行notify/notifyall: 唤醒因锁池中的线程,使之运行
d.sleep方法
sleep()方法导致了程序暂停执行指定的时间&#xff0c;让出cpu给其他线程&#xff0c;但是他的监控状态依然保持者&#xff0c;当指定的时间到了又会自动恢复运行状态。
————————————————————————————————————————未完待续&#xff0c;欢迎各位大佬指出问题。