1.现在有T1,T2,T3三个线程,你怎么样保证T2在T1执行完后执行,T3在T2执行完后执行。
这个考察的知识点是对join的使用
实际上先启动三个线程中哪一个都行,
因为在每个线程的run方法中用join方法限定了三个线程的执行顺序。
即便是第二个线程先启动执行了,由于t1.join()方法,
使得线程
2
需要等待线程
1
运行结束后才能继续运行。
所以三个线程的启动顺序无关紧要!!!
/**
*
* @author zy
* @date 2017年10月22日 下午7:17:50
* @Decription 现在有T1,T2,T3三个线程,你怎么样保证T2在T1执行完后执行,T3在T2执行完后执行。
*/
public class JoinTest {
public static void main(String[] args) {
final Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
System.out.println("t1");
}
});
final Thread t2 = new Thread(){
@Override
public void run() {
try {
t1.join();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("t2");
}
};
final Thread t3 = new Thread(new Runnable() {
@Override
public void run() {
try {
t2.join();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("t3");
}
});
t2.start();
t1.start();
t3.start();
}
}
2.在Java中Lock接口比synchronized块的优势是什么?
lock接口在多线程和并发编程中最大的优势是它们为读和写分别提供了锁,它能满足你写像ConcurrentHashMap这样的高性能数据结构和有条件的阻塞。
Lock:是Lock接口中使用最多的获取锁的方法,如果锁被其他线程占用就等待。由于Lock接口是基于JDK层面的,所以,锁的释放动作必须手动进行。不像synchronized是基于Java语言的特性,属于JVM层面,锁的获取和释放动作都由JVM自动进行,对开发者是透明的。
使用方式:
Lock lock = ...; lock.lock();
try{
//处理任务
}catch(Exception ex){
}finally{
lock.unlock(); //释放锁
}
tryLock:表示用来尝试获取锁,如果获取成功即返回TRUE,如果锁被其他线程占用,则返回FALSE;该方法会立即返回结果,不会一直处于等待状态。
tryLock(long time,TimeUnit unit):与tryLock类似,区别在于这个方法在拿不到锁的情况下会等待一个时间time,在时间期限之内如果还拿不到锁,就返回FALSE;同时可以相应中断。如果在一开始或者等待期间获得了锁,则返回true。
问题:如果在开始没有拿到锁,那么代码块会进入到等待状态么?
猜想:我觉得会进入等待状态,不过在等待的这段时间内,会存在一个响应机制来监测别的线程是否释放了锁,如果释放了锁,则直接有该线程获取锁,该方法返回TRUE;如果没有释放,那么该方法将不再享有响应机制的提醒,并返回FALSE。
使用方式:
Lock lock = ...;
if(lock.tryLock()) {
try{
//处理任务
}catch(Exception ex){
}finally{
lock.unlock(); //释放锁
}
}else {
//如果不能获取锁,则直接做其他事情
}
lockInterruptibly:当通过这个方法尝试获取锁时,如果线程正在等待获取锁,那么这个线程能够响应中断,即被自己或者其他线程中断线程的等待状态。例如,当两个线程同时通过lock.lockInterruptibly()方法获取锁时,假如线程A获取了锁,那么线程B就只能进入等待状态,那么对线程B调用ThreadB.interrupt()能够中断线程B的等待状态。
注意:lockInterruptibly方法必须放在try块中或者在调用lockInterruptibly的方法外声明抛出InterruptedException,推荐使用后者。
使用方式:
publ