- 多线程的实现方式有几种方法?
- 继承Thread类,用start方法启动线程
- 实现Runnable接口(多重继承中优先使用),用new Thread(Runnable target).start()方法来启动
- Thread.start()和Thead.run()的区别?
- start()方法(native)是用来调用启动线程的,使线程进入就绪状态。
- run()方法是用来线程的入口函数,当cpu分配时间给当前线程是,jvm调用该线程的run()方法。
- ThreadLocal类的使用?
- 定义:ThreadLocal为每个使用该变量的线程提供独立的变量副本,所以每一个线程都可以独立地改变自己的副本,而不会影响其它线程所对应的副本。
- 四个方法:
- void set(Object value)设置当前线程的线程局部变量的值。
- public Object get()该方法返回当前线程所对应的线程局部变量。
- public void remove()将当前线程局部变量的值删除,目的是为了减少内存的占用,该方法是JDK 5.0新增的方法。需要指出的是,当线程结束后,对应该线程的局部变量将自动被垃圾回收,所以显式调用该方法清除线程的局部变量并不是必须的操作,但它可以加快内存回收的速度。
- protected Object initialValue()返回该线程局部变量的初始值,该方法是一个protected的方法,显然是为了让子类覆盖而设计的。这个方法是一个延迟调用方法,在线程第1次调用get()或set(Object)时才执行,并且仅执行1次。ThreadLocal中的缺省实现直接返回一个null。
- sleep() 、suspend()和 wait() 有什么区别?
- sleep()不释放同步锁,wait()释放同步锁,因此wait(),notify()和notifyAll()只能在同步控制方法或者同步控制块里面使用,而sleep可以在任何地方使用
- sleep(milliseconds)睡眠指定时间后自动醒过来,时间不到时,可以调用interreput()打断睡眠,而wait(milliseconds)/wait()后直到超时或者使用notify()/notifyAll()来唤醒
- sleep()是Thread类的方法,而wait()是Object类的方法
- sleep()是线程的运行状态,而wait()是线程之间的通讯
- sleep()必须捕获异常,而wait(),notify()和notifyAll()不需要捕获异常
- 多线程的同步?
- synchronized关键字,可以修饰函数或者代码块,当函数比较大的时候,应该用synchronized修饰代码块,因为加上synchronized时,代码执行效率会降低。
- 线程死锁的问题?怎么避免死锁?
- 死锁条件
(1)互斥条件:一个资源每次只能被一个进程使用。
(2)请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。
(3)不可剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺。
(4)循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。 - 避免死锁
(1) 等待某个资源时,使用超时机制
(2) 采用消息通信的通信机制,而不是共享内存的通信机制
- 多线程资源的共享和独享?
- 共享的:堆、全局变量、静态变量、文件等公共资源
- 独享的:栈、寄存器
- 线程的状态?状态:创建、就绪、运行、阻塞、死亡
- 线程池
- ThreadPoolExecutor类
- 线程池状态:
volatile int runState;
static final int RUNNING = 0;
static final int SHUTDOWN = 1;
static final int STOP = 2;
static final int TERMINATED = 3;