A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

java有几种线程?
答:java中的线程分为守护线程(Daemon)和用户线程(User)两种。

怎么把线程设置为守护线程?
答:通过Thread.setDaemon(true)方法可以把线程设置为守护线程。但是这个方法一定要在Thread.start()方法前调用,不能把正在运行的常规线程设置为守护线程,否则在运行时会抛出IllegalThreadStateException异常

说说对守护线程和用户线程的理解?
答:守护线程是为用户线程服务的,比如JVM的垃圾回收线程就是守护线程,但没有任何用户线程存在时,守护线程也就没有了可服务的对象,那么这是虚拟机就会自动退出。

在守护线程(Daemon)中产生的新线程是什么类型的?
答:也是Daemon类型。

如何在两个线程间共享数据?
答:可以通过共享对象来实现这个目的,或者是使用像阻塞队列这样并发的数据结构。用wait和notify方法实现了生产者消费者模型。

Java中notify和notifyAll有什么区别?
答:notify()方法不能指定唤醒某个具体的线程,随机的,不过如果能确定只有一个线程在等待时,用它就没错了。而notifyAll()方法就不一样了,它是唤醒全部等待的线程,让它们一起去竞争锁,这样确保至少有一个线程能继续运行。

为什么wait,notify和notifyAll这些方法不定义在Thread类里面?
答:首先要知道java中提供的锁都是对象级别的,而不是线程级别。wait,notify和notifyAll这些方法都是对锁的操作,而锁是对象才有的,所以要把他们定义在Object类中而不是Thread类。

为什么wait和notify方法要在同步块中调用?
答:因为JavaAPI强制要求要这样做,否则代码会抛出IllegalMonitorStateException异常。还有一个原因是为了避免wait和notify之间产生竞态条件。

Thread 类中的yield方法有什么作用?
答:yield()方法是静态的native方法。调用它可以使当前线程让出CPU资源,暂停当前正在执行的线程对象,让其它有相同优先级的线程执行。不过即使调用了yield()方法,也不能保证其他线程一定能顺利执行,因为yield()方法并不会释放锁,很可能就是暂停一下,然后就继续执行当前线程了。

说说对ThreadLocal的理解?
答:可参考本篇博客【简析ThreadLocal】


0 个回复

您需要登录后才可以回帖 登录 | 加入黑马