线程5问?

1.讲一下线程之间的通信

   a. 把数据设置成线程对象的成员变量

   b. 通过主线程的静态的回调函数

   c. 使用中间方,消息队列 

2.讲一下线程的五种状态

  大致分为创建、可运行、运行、阻塞、销毁等五个状态。

                        new() 一个线程 : 创建状态

       start() 方法:可运行状态

                         CPU调度,决定当前的对象是否是 运行 OR 阻塞      sleep ( ) 主动进入阻塞

       run( ) 运行完毕 ,自动进入 销毁状态

其中可运行状态和运行状态可以相互转换,阻塞状态和可运行状态可以相互转换。

线程进入Runnable状态的情况

(1)调用sleep()方法后经过的时间超过了指定的休眠时间

(2)线程调用的阻塞IO已经返回,阻塞方法执行完毕

(3)线程成功得获得了试图同步的监视器

(4)线程正在等待某个通知,其他线程发出了通知

(5)处于挂起状态的线程调用了resume方法恢复线程

线程出现阻塞状态的情况

(1)线程调用sleep方法,主动放弃占用的处理器资源

(2)线程调用了阻塞式IO方法,在方法返回前,该线程被阻塞

(3)线程试图获得一个同步监视器,但是该同步监视器正被其他线程所持有

(4)线程等待某个通知

(5)程序调用了suspend()方法,挂起该线程,此方法容易导致死锁,应该避免调用。

 

3.讲一下为什么会出现死锁.

  在多个线程(2个以上)的情况下,相互持有对方需要的锁对象,或者循环持有. 等待对方释放,

    解决方案:多线程之间保持相同加锁顺序,尽可能预防出现死锁.

4.讲一下线程同步机制

 1. 在需要同步的方法的方法签名中加入synchronized关键字。

 2. 使用synchronized块对需要进行同步的代码段进行同步。

 3. 使用JDK 5中提供的java.util.concurrent.lock包中的Lock对象。

注:

1、对于同步的方法或者代码块来说,必须获得对象锁才能够进入同步方法或者代码块进行操作;


2、如果采用method级别的同步,则对象锁即为method所在的对象,如果是静态方法,对象锁即指method所在的
Class对象(唯一);


3、对于代码块,对象锁即指synchronized(abc)中的abc;


4、因为第一种情况,对象锁即为每一个线程对象,因此有多个,所以同步失效,第二种共用同一个对象锁lock,因此同步生效,第三个因为是
static因此对象锁为ThreadTest3的class 对象,因此同步生效。

如上述正确,则同步有两种方式,同步块和同步方法(为什么没有wait和notify?这个我会在补充章节中做出阐述)

如果是同步代码块,则对象锁需要编程人员自己指定,一般有些代码为synchronized(this)只有在单态模式才生效;
(本类的实例有且只有一个)

如果是同步方法,则分静态和非静态两种 。

静态方法则一定会同步,非静态方法需在单例模式才生效,推荐用静态方法(不用担心是否单例)。

LOCK:

Java提供了同步代码块的另一种机制,它比synchronized关键字更强大也更加灵活。这种机制基于Lock接口及其实现类(例如:ReentrantLock)
它比synchronized关键字好的地方:
1、提供了更多的功能。tryLock()方法的实现,这个方法试图获取锁,如果锁已经被其他线程占用,它将返回false并继续往下执行代码。
2、Lock接口允许分离读和写操作,允许多个线程读和只有一个写线程。ReentrantReadWriteLock
3、具有更好的性能

5.讲一下java如何实现多线程。

    a. 继承Thread 对象

 b. 实现runnable()接口

    c.直接使用线程池工具

原文地址:https://www.cnblogs.com/zeenzhou/p/11186956.html