多线程的使用及run和start的区别

多线程就是分时利用CPU,宏观上让所有线程一起执行 ,也叫并发

一、线程的五种状态

  • 创建:new一个线程对象,进入创建状态;
  • 就绪:当调用了线程对象的start方法之后,该线程就进入了就绪状态,但是此时线程调度程序还没有把该线程设置为当前线程,此时处于就绪状态。此外,在线程运行之后,从等待或者睡眠中结束,也会处于就绪状态;
  • 运行:线程调度程序将处于就绪状态的线程设置为当前线程,此时线程就进入了运行状态,开始运行run函数当中的代码;
  • 阻塞:线程正在运行的时候,被暂停,通常是为了等待某个事件的发生(比如说某项资源就绪)之后再继续运行。sleep,suspend,wait等方法都可以导致线程阻塞;
  • 死亡:如果一个线程的run方法执行结束或者调用stop方法后,该线程就会死亡。对于已经死亡的线程,无法再使用start方法令其进入就绪。

二、原理

  调用 start() 后,线程会被放到等待队列,等待CPU调度,并不一定要马上开始执行,只是将这个线程置于可动行状态。然后通过JVM,线程Thread会调用run()方法,执行本线程的线程体。

  先调用start后调用run,为什么不直接调用run?直接调用run等同于单线程运行,为实现多线程所做的操作全部白给

  1. start() 方法来启动线程,真正实现了多线程运行。这时无需等待run方法体代码执行完毕,可以直接继续执行下面的代码;通过调用Thread类的start()方法来启动一个线程, 这时此线程是处于就绪状态, 并没有运行。 然后通过此Thread类调用方法run()来完成其运行操作的, 这里方法run()称为线程体,它包含了要执行的这个线程的内容, run方法运行结束, 此线程终止。然后CPU再调度其它线程。
  2. run() 方法当作普通方法的方式调用。程序还是要顺序执行,要等待run方法体执行完毕后,才可继续执行下面的代码; 程序中只有主线程——这一个线程, 其程序执行路径还是只有一条, 这样就没有达到写线程的目的。

三、实现并启动线程的两种方法

  实际上Thread类继承Runnable接口,Runnable接口中只有一个抽象方法run(),

  1、继承自Thread类,重写run方法。用start方法启动线程

  2、实现Runnable接口,实现start方法(new Thread(Runnable target).start()),实现run方法。用.start()方法启动

参考:

  https://blog.csdn.net/sanyaoxu_2/article/details/79069772

posted @ 2021-09-16 14:38  二十三年蝉、  阅读(507)  评论(0)    收藏  举报