-
多线程的价值
(1)发挥多核CPU的优势
多线程可以真正发挥多核Cpu的优势,采用多线程的方式同时去完成·几件事而互不干扰,达到充分利用Cpu的目的。
(2)防止阻塞
从程序运行效率来看,单核CPU会由于运行多线程导致上下文的切换,而降低程序整体效率。但是单核CPU还是要用多线程,目的就是为了防止阻塞。比如现在是单核CPU单线程,进行数据读取,对端迟迟不返回且未设置超时时间,那么整个程序在数据返回之前就停止运行了。多线程可以防止这个问题,一条线程的代码执行读取数据阻塞,也不会影响其他任务执行。
(3)效率高
. -
创建线程的几种方式
(1)继承Thread类创建线程类
(2)实现Runnable接口创建线程类
(3)通过Callable和Future创建线程
(4)通过线程池的创建 -
创建线程的三种方式的对比
(1)采用实现Runnable、Callable接口的方式创建线程
线程类只是实现了接口,还可以继承其他类。这种方式下,多个线程可以共享同一个target对象,适合多个相同线程处理同一份资源的情况,从而可以将CPU、代码和数据分开,形成清晰的模型,较好体现了面向对象的思想。
劣势:代码稍微复杂,获取当前线程要使用Thread.currentThread()方法
(2)继承Thread类的方式创建多线程
已经继承了Thread类,不能再继承其他父类
(3)Runnable和Callable的区别
1.Callable规定(重写)的方法是call(),Runnable规定(重写)的方法是run()
2.Callable的任务执行后有返回值,Runnable没有
3.call()方法可以抛出异常,run()方法不可以
4.运行Callable任务会拿到一个Future对象,表示异步计算的的结果。通过Future对象可了解任务执行情况,可取消任务的执行,可获取执行结果。 -
Java线程中的基本状态
(1)新建状态:new
线程对象创建后,即进入了新建状态。Thread thread=new MyThread();
(2)就绪状态:Runnable
当调用线程对象的start()方法(thread.start()),线程即进入就绪状态。
处于就绪状态的线程,说明此线程已经做好了准备,随时等待CPU的调度执行。并不是说执行了thread.start()此线程就会立即执行
(3)运行状态(Running):
当CPU开始调度处于就绪状态的线程时,此时线程才得以真正的执行,进入运行状态。
注:就绪状态是进入到运行状态的唯一入口,也就是说,线程要想进入运行状态执行,首先必须处于就绪状态中。
(4)阻塞状态(Blocked)
处于运行状态中的线程由于某种原因,暂时放弃对CPU的使用权,停止执行,此时就进入阻塞状态,直到进入就绪状态,才 有机会被CPU调用进入运行状态
(1)等待阻塞:运行状态中的线程执行wait()方法,使本线程进入到等待阻塞状态。
(2)同步阻塞:线程在获取synchronized同步锁失败(因为锁被其他线程占用),
它会进入同步阻塞状态。
(3)其他阻塞:通过调用线程的sleep()或join()或发出了I/O请求时,线程会进入到阻塞状态。当sleep()状态超时,join()等待线程终止或超时,或者I/O处理完毕时,线程重新转入就绪状态。
(5)死亡状态(dead)
线程执行完或因异常退出了run()方法,该线程结束生命周期。