1、问题一:为什么用多线程?它有什么优缺点?
答:发挥CPU的优势、防止阻塞
优点:a) 使程序的相应速度更快 b) 当前没有进行处理的任务时可以将处理器时间让给其它任务 c) 占用大量处理时间的任务可以定期将处理器时间让给其它任务; d)可以随时停止任务; e) 可以分别设置各个任务的优先级以优化性能
缺点: a)对线程进行管理要求额外的 CPU开销 b)线程的死锁 c) 对公有变量的同时读或写 d)等候使用共享资源时造成程序的运行速度变慢
2、问题二:怎么实现多线程?
答: a) 、继承Thread类
b)、实现Runnable接口--->一般会用,因为java只能单继承;增强程序的健壮性,代码能够被多个线程共享
c) 、实现Callable接口----->Callable能返回一个异步处理的结果Future对象并能抛出异常,而其他两种不能
d) 、使用线程池
3、问题三:start()和run()方法的区别
答:调用了start()是用来启动线程的,真正实现多线程的特性,因为start()方法启动会进入就绪状态,并没有执行;
run()方法是线程体,如果直接调用thread.run()方法执行就相当于普通方法,而没有达到多线程的功能,多线程是利用cpu的时间片来达到并发的效果,直接调用run()就不会有并发的效果
Runnable是任务,而不是线程。
runnable必须放在thread里执行才能实现多线程
thread也是实现的runnable接口
4、问题四:java中线程的6种状态
答 : 1)、初始(NEW):实现Runnable接口和继承Thread可以得到一个线程类,new一个实例出来,线程就进入了初始状态。
2)、运行(RUNNABLE):Java线程中将就绪(ready)和运行中(running)两种状态笼统的称为“运行”。就绪:(a)调用线程的start()方法,此线程进入就绪状态;(b)当前线程sleep()方法结束,其他线程join()结束,等待用户输入完毕,某个线程拿到对象锁,这些线程也将进入就绪状态;(c)当前线程时间片用完了,调用当前线程的yield()方法,当前线程进入就绪状态;(d)锁池里的线程拿到对象锁后,进入就绪状态。运行:线程调度程序从可运行池中选择一个线程作为当前线程时线程所处的状态。
3)、阻塞(BLOCKED):阻塞状态是线程阻塞在进入synchronized关键字修饰的方法或代码块(获取锁)时的状态。
4)、等待(WAITING):处于这种状态的线程不会被分配CPU执行时间,它们要等待被显式地唤醒,否则会处于无限期等待的状态。
5)、超时等待(TIMED_WAITING):处于这种状态的线程不会被分配CPU执行时间,不过无须无限期等待被其他线程显示地唤醒,在达到一定时间后它们会自动唤醒。
6)、终止(TERMINATED):表示该线程已经执行完毕。
参考:https://blog.csdn.net/qq_22771739/article/details/82529874
5、问题五:Java中Runnable和Callable有什么不同?
答:相同点: 两者都可用来编写多线程程序;两者都需要调用Thread.start()启动线程;
不同点:a). 两者最大的不同点是:实现Callable接口的任务线程能返回执行结果;而实现Runnable接口的任务线程不能返回结果;
b). Callable接口的call()方法允许抛出异常;而Runnable接口的run()方法的异常只能在内部消化,不能继续上抛;
6、问题六:Java多线程中调用wait() 和 sleep()方法有什么不同?
答:相同点:都可以起到阻塞的作用;都可以通过interrupt()方法 打断线程的暂停状态 ,从而使线程立刻抛出InterruptedException;
不同点:a) 、Thread类的方法:sleep(),yield()等 ;Object的方法:wait()和notify()等
b) 、每个对象都有一个锁来控制同步访问。Synchronized关键字可以和对象的锁交互,来实现线程的同步。sleep方法没有释放锁,而wait方法释放了锁,使得其他线程可以使用同步控制块或者方法。
c) 、wait,notify和notifyAll只能在同步控制方法或者同步控制块里面使用,而sleep可以在任何地方使用
d) 、sleep必须捕获异常,而wait,notify和notifyAll不需要捕获异常
原文:https://www.cnblogs.com/manu24/p/12089617.html