1、简述线程的基本状态以及状态之间的关系?
线程有创建、就绪、执行、阻塞、终止5种基本状态。开发者可以通过继承Thread类、继承Runnable接口或者继承Callable接口创建线程,通过调用Thread类中的start()方法使线程进入就绪状态,线程在获得cpu资源后通过调用run()方法或者call()方法进入执行状态,java中可以通过调用sleep()、walt()等方法使线程进入阻塞状态,进入阻塞状态的线程可以重新进入就绪状态等待cpu调度,线程执行完毕后进入终止状态。
2、启动一个线程是start()方法还是run()方法?
java中通过调用start()方法启动线程,使线程进入就绪状态,在线程获得cpu资源后才会调用run()方法进入执行状态。
3、请解释下什么是线程池?
线程池就是存放线程的容器,为了减少创建和销毁线程对象的开销,java中可以通过Executors接口创建线程池,当需要时从线程池取出线程执行任务,使用完毕不销毁线程,而是将线程放回线程池当中以便后续任务的使用。Executors接口提供了4个静态方法用于创建线程池:
- newCachedThreadPool():创建一个可缓存的线程池,线程池容量大小为整数最大值。
- newSingleThreadExecutor():创建一个单线程的线程池,这个线程池只有一个线程在工作,可以保证提交的任务按顺序执行。
- newFixedThreadPool(int ):创建指定容量的线程池。
- newScheduledThreadPool():创建容量不限的线程池,此线程池支持定时及周期性执行任务。
4、如何保证线程安全?
线程安全体现在原子性、可见性、有序性三个方面。java中主要以加锁的方式保证原子性,即,通过synchronized关键字或者Lock锁机制,synchronized可以用于修饰代码块也可以用于修饰方法。可以使用volatile关键字保证线程的可见性,volatile关键字的可见性是通过内存屏障和禁止重排序实现的,但volatile关键字不能保证原子性。
5、请简述线程的sleep()方法和yield()方法有什么区别?
(1)、sleep()方法释放资源给其它线程时不考虑优先级,而yield()方法只会将资源让给相同优先级或者更高优先级的线程。
(2)、线程执行sleep()方法后进入阻塞状态,而执行yield()方法后进入就绪状态。
(3)、sleep()方法声明抛出中断异常,yield()方法没有声明任何异常。
(4)、sleep()方法比yield()方法具有更好的移植性。
6、java中有几种方法可以实现一个线程?用声明关键字修饰同步方法?stop()和suspend()方法为何不推荐使用?
(1)、有三种实现线程的方法:继承Thread类,继承Runnable接口以及继承Callable接口。其中Callable()接口中的线程执行方法有返回值。
(2)、用synchronized关键字修饰同步方法,synchronized关键字也可以修饰代码块和类,修饰代码块和普通方法时作用于调用的对象,修饰类和静态方法时作用于所有对象。
(3)、反对使用stop()方法是因为它不安全,它会解除由线程获取的所有锁定,如果对象处于一种不连贯的状态,那么其它线程能在那种状态下检查和修改它们。结果往往很难检查出问题所在。
(4)、suspend()方法有可能会引起死锁,调用suspend()方法的时候,目标线程会停下来,但不会释放之前获得的锁,在这种情况下,其它资源无法访问被锁定的资源,就会造成死锁。
7、线程中的同步和异步有何异同?什么情况下需要使用同步?
如果某种资源或者数据是临界资源,这种资源就必须使用同步处理,线程必须按照一定的规则去申请这种临界资源。当应用程序在对象上调用了一个方法但并不需要等待方法的返回结果时就可以使用异步编程。异步编程的效率往往更高,因为不需要等待。
8、请说明sleep()方法和wait()方法的区别?
(1)、sleep()方法是Thread类当中的方法,执行此方法使线程进入阻塞状态,将资源让给其它线程执行,但监控状态依然保持,到时间后会自动恢复,调用sleep()不会释放对象锁。
(2)、wait()方法是Object类当中的方法,调用wait()方法会使线程放弃对象锁,进入等待此对象的等待锁定池,只有调用notify()方法或者notifyAll()方法后线程才会进入对象锁定池准备获得锁对象进入运行状态。
9、请你说明下在监视器(Monitor)内部是如何做到线程同步的?
监视器和锁在java虚拟机中是一块使用的。监视器监视一块同步代码块,确保一次只有一个线程执行同步代码块。每一个监视器都和一个对象引用关联。线程在获取锁之前不允许执行同步代码块。
10、请说明同步代码块和同步方法的区别?
同步方法默认用this或当前类对象作为锁。同步代码块可以选择加什么锁,比同步方法要更细颗粒度。一般都是同步代码块,可以节省一点开销。
11、请详细描述下线程从创建到死亡的几种状态都有哪些?
(1)、创建:线程通过继承Thread类、Runnable接口或者Callable接口创建一个线程类。
(2)、就绪:线程通过调用Thread类中的start()方法启动线程进入就绪状态。
(3)、执行:线程在获得了cpu时间片之后即可调用run()方法或者call()方法进入执行状态。
(4)、阻塞:阻塞状态是线程因为某种原因放弃了cpu使用权,也让让出了cpu的时间片,暂时停止运行。线程可以通过调用wait()方法进入等待阻塞状态,该线程会被jvm放入等待队列。线程也可能因为没有获得相应的锁而进入同步阻塞,jvm会将该线程放入锁池。线程也可以通过调用sleep()方法、join()方法或者其它原因进入阻塞状态。
(5)、终止:线程执行完毕后进入终止状态,线程终止后不可恢复。
原文转载:http://www.shaoqun.com/a/485962.html
lithium:https://www.ikjzd.com/w/2505
淘粉吧:https://www.ikjzd.com/w/1725
ebay易趣:https://www.ikjzd.com/w/210
1、简述线程的基本状态以及状态之间的关系?线程有创建、就绪、执行、阻塞、终止5种基本状态。开发者可以通过继承Thread类、继承Runnable接口或者继承Callable接口创建线程,通过调用Thread类中的start()方法使线程进入就绪状态,线程在获得cpu资源后通过调用run()方法或者call()方法进入执行状态,java中可以通过调用sleep()、walt()等方法使线程进入阻塞状
法瑞儿:https://www.ikjzd.com/w/412
转运中国:https://www.ikjzd.com/w/1549
2018跨境圈邮政涨价、库存限制,卖家该如何规划自己的成本?:https://www.ikjzd.com/home/12338
深圳华侨城旅行社好不好:http://tour.shaoqun.com/a/539.html
珠海圆明新园好玩吗?:http://tour.shaoqun.com/a/4090.html
没有评论:
发表评论