1.通过继承Thread类实现,实现简单但不可以继承其他类,多个线程之间无法共享该线程类的实例变量。 2.实现Runnable接口,较继承Thread类,避免继承的局限性,适合资源共享。 3.使用Callable,方法中可以有返回值,并且抛出异常。 4.创建线程池实现,线程池提供了一个线程队列,队列中保存所有等待状态的线程,避免创建与销毁额外开销,提高了响应速度。
https://blog.csdn.net/longshengguoji/article/details/41126119
线程的生命周期:线程要经历新建、就绪、运行(活动)、阻塞和死亡五种不同的状态。这五种状态都可以通过Thread类中的方法进行控制。 ① 新建状态 、使用new 操作符创建一个线程后,该线程仅仅是一个空对象,这时的线程处于创建状态。 ② 就绪状态 、使用start()方法启动一个线程后,系统为该线程分配了除CPU外的所需资源,使该线程处于就绪状态。 ③ 运行状态 、系统真正执行线程的run()方法。 ④ 阻塞和唤醒线程阻塞状态 、使用sleep(),wait()方法进行操作。 ⑤ 死亡状态 、线程执行了interrupt()或stop()方法,那么它也会以异常退出的方式进入死亡状态。 https://blog.csdn.net/xiaosheng900523/article/details/82964768
主要区别 Runnable 接口 run 方法无返回值;Callable 接口 call 方法有返回值,支持泛型 Runnable 接口 run 方法只能抛出运行时异常,且无法捕获处理;Callable 接口 call 方法允许抛出异常,可以获取异常信息
https://blog.csdn.net/mryang125/article/details/81878168
线程对象调用 run 方法不开启线程。仅是对象调用方法。 线程对象调用 start 开启线程,并让 jvm 调用 run 方法在开启的线程中执行 调用 start 方法可以启动线程,并且使得线程进入就绪状态,而 run 方法只是 thread 的一个普通方法,还是在主线程中执行。
https://blog.csdn.net/woshizisezise/article/details/79938915