一.FutureTask类有什么作用?它实现了哪些接口?Callable接口和Runnable接口有什么不同?
-
实现了Runnable , Future , RunnableFuture 接口
- FutureTask 实现了 RunnableFuture 接口,而 RunnableFuture 分别继承了 Runnable 和 Future 接口
-
既可以作为Runnable被线程执行,又可以作为Future得到Callable的返回值,拿到线程执行的结果。
二.请查阅JDK自学线程池的相关类,如ThreadPoolExecutor构造器各个参数的意义,利用线程池编写多线程程序。
- corePoolSize:最大核心线程数
- maximumPoolSize:最多线程数
- keepAliveTime:空闲线程的活跃时间
- TimeUnit 时间单位
- BlockingQueue 任务队列
- ThreadFactory 线程工厂
- RejectStrategy 拒绝策略
- Abort 抛异常
三.volatile关键字有什么作用?
- 保证了不同线程对这个变量进行操作时的可见性,
- 禁止指令重排序优化
四.Java提供了哪些同步机制来实现互斥?
- Java 提供了两种锁机制来控制多个线程对共享资源的互斥访问。
- JVM 实现的 synchronized。
- JDK 实现的 ReentrantLock。
五.编写Java程序模拟烧水泡茶最优工序。
六.请使用Java并发包的Lock及Condition改写例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();}
}