多线程涉及内容较多,相对来说较为复杂,但是越是这样的知识,就需要归纳总结,这样才能深刻的理解并成为自己的知识,下面我对多线程已问题的方式进行总结:
1,多线程到底有什么用:
①,多大程度的发挥多cpu优势,我们知道一个时间点一个cpu只能运行一个线程,如果是单线程这样就浪费了多核cpu的优势。
②,防止阻塞,因为cpu是抢占式运行,当线程阻塞时,可以切换到其它线程进行运行。
③,便于建模,可以将一个复杂的任务分解成多个子任务单独运行,提高了运行速度,降低了任务的复杂性。
2,创建线程的方式和方法有哪些?
①,有继承Thread类和实现Runnable接口两种方式,实现Runnable接口方式优于继承Thread类的方式,因为这样可以降低程序之间的耦合度,符合程序设计的六大原则之一。
②,有start()和run()两种方法,前者测试真正实现了多线程,而后则是thread类的一个方法,只会按顺序进行执行。
3,volatile关键字作用?
volatile关键字作用是保证多线程的可见性和原子性,volatile修饰的关键字在多线程间可见,并保证该数据为最新原则,同时也降低了线程的运行效率,因为阻止了jvm运行效率最大化对线程进行重排,同时volatile和CAS结合保证线程的原子性。
4,什么是线程安全:
个人理解,在多线程和单线程下,运行结果相同,我们就任务线程是安全的!
例如:string integer long 都是用final修饰的为线程安全的,ArrayList HashMap 都是非线程安全的类,在编程中需要注意!
5,为什么使用线程池
目的无非就是避免重复创建和销毁线程带来的内存开销,达到线程对象的重用,使用线程是可以根据项目特点灵活的控制线程并发数。
5,如何获取线程dump信息?
线程出现死循环、死锁、阻塞、访问慢的问题都可以通过dump信息进行分析查看,常用获取dump信息的方式,首先获取线程pid信息,可以用ps -ef|grep pid进行查看,打印dump信息,可以通过kill -3 pid进行打印或者stack pid
6,liunx下如何查看哪个线程占用cpu时间最长
获取当前进程的pid,通过top -H -p pid 或者 top -H -p '' jps pid"就能看出占用当前cpu时间最长的线程,前者是十进制,后者是十六进制