多线程是比较抽象的,大概都可以写出一本书的内容,下面就是个人对多线程的理解与总结:
线程是进程执行运算的最小单位,可以完成一个独立的顺序控制流程,一个进程至少有一个线程。
多线程的好处:可以充分的利用CPU的资源;简化编程模式;带来良好的用户体验。
多线程的缺点:每开辟一个子线程就消耗一定资源,会造成代码可读性变差,如果多个线程访问一个资源,会出现资源争夺的。
Java中多线程的实现方式:
1.继承Thread类创建线程
线程继承了Thread类要重写Run()方法,run()是线程要执行操作任务的方法,线程要操作的代码都需要写在run()方法里,通过statr()方法启动线程后调用;
定义MyThread类继承Thread类:
- public class MyThread extends Thread {
- public void run() {
- for(int i=1;i<100;i++){
- System.out.println(Thread.currentThread().getName()+":"+i)
- }
- }
线程的启动:
- public static void main(String[] args) {
- MyThread myThread = new MyThread();
- myThread.start();
- }
调用start()方法和run()方法的区别:
图一只有主线程一条执行路径 图二多条执行路径,主线程和子线程并行交替执行
2.实现Runnable接口创建线程
Thread类有一个缺点,如果定义的类继承了其他类的话,就不能再继承Thread类了,使用Runnable接口创建线程的方式可以解决上述的问题。
定义MyRunnable类实现Runnable接口:
- public class MyRunnable implements Runnable{
- public void run(){
- for(int i=1;i<100;i++){
- System.out.println(Thread.currentThread().getName()+":"+i);}}}
创建线程对象
- public static void main(String[] args) {
- MyRunnable myRunnable = new MyRunnable();
- Thread myThread = new Thread(myRunnable);
- myThread.start();
- }
两种创建线程的方式有各自的特点和应用领域:
直接继承Thread类的方式,编写简单,可以直接操作线程,适合用于单继承的情况;
当线程继承了另一个类时,只能实现Runnable接口的方式创建,这种方式可以实现多个线程之间的资源共享。
线程的状态
创建状态:当使用new创建一个线程时,线程并没有开始运行
就绪状态:当线程对象调用start方法以后,线程并不一定开始执行,它必须和其他线程抢占CPU资源,在没有抢到资源之前,处于就绪状态
运行状态:当线程抢占到CPU资源以后,进入运行状态,开始执行run方法
阻塞状态:线程阻塞可能由多种原因引起。比如sleep方法,I/O线程阻塞,线程锁等
死亡状态:两种原因 (1.run方法正常退出,线程自然死亡 2.发生异常,导致线程猝死)
线程常用的方法
1. setName():给线程设置名字 getName():获取线程的名字
2. currentThread():获取当前线程
3. isAlive():判断线程是否在执行
4. Join(): 可以通过join()方法使得某一个线程强制运行,此线程强制运行期间,其他线程无法运行,必须等待此线程完成之后,才可以继续运行。
5. Sleep():在指定时间内,让线程进入休眠,并且释放CPU资源
6. Interrupt(): 一个线程可以被另一个线程中断其操作的状态
7. getPriority():获取线程的优先级 setPriority():设置线程的优先级
8. Yield():线程礼让。