关于Java(8)
- FutureTask类有什么作用?它实现了哪些接口?Callable接口和Runnable接口有什么不同?
作用:
1.是runnable的实现
2.它的构造参数接受callable
3.并且有泛型定义,记录任务的执行结果
4.get方法可以获取callable任务的执行结果,如果任务执行完直接返回结果,任务还没执行完,调用线程会阻塞线程直至get返回结果
不同之处:callable可以携带返回值,泛型,可以抛出异常,callable的方法名是call,runnable方法名是run。 - volatile关键字有什么作用?
1.多线程之间可见性。
2.禁止指令重排序。 - Java提供了哪些同步机制来实现互斥?
- 对象监视器(monitor)与synchronized
Synchronized的三种用法:
synchronized 代码块:监视器就是指定的对象。
synchronized 方法:监视器就是this对象。
synchronized 静态方法:监视器就是相应的Class对象。 - Java并发包中的锁类
接口
ReentrantLock类
-
编写Java程序模拟烧水泡茶最优工序。
(图源Java课PPT) -
请使用Java并发包的Lock及Conditon改写例9.11。
- 存钱
void put(int i) {
lock.lock(); //使用锁取代同步方法
try{
while(isMoney){
try{
SaveCondition.await(); //存钱线程等待
} catch(Exception e){}
}
value = value + i;
System.out.println("存入"+i+" 账上金额为:"+value);
isMoney = true;//设置标志
FetchCondition.signal(); //唤醒等待资源的取钱线程
} finally {
lock.unlock();
}
}
- 取钱
int get(int i) {
lock.lock();
try{
while(!isMoney ){
try {
FetchCondition.await(); //取钱线程等待
} catch(Exception e){}
}
if (value>i)
value = value - i;
else {
i = value;
value = 0; }
System.out.println("取走"+i+" 账上金额为:"+value);
isMoney = false;
SaveCondition.signal(); //唤醒等待资源的存钱线程
return i;
} finally {
lock.unlock();}
}