前两种很常见,给出第三种的代码实现
public class CallableAndFuture {
public static void main(String[] args) {
Callable<Integer> callable = new Callable<Integer>() {
public Integer call() throws Exception {
return new Random().nextInt(100);
}
};
FutureTask<Integer> future = new FutureTask<Integer>(callable);
new Thread(future).start();
try {
Thread.sleep(5000);// 可能做一些事情
System.out.println(future.get());
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
}
}
在调用完 bar.wait(); 的时候当前线程会释放对 bar 对象的锁,但是要离开该对象的监视器还要等 synchronized 代码块执行完毕
public void foo(){
synchronized (bar){
// 其它代码
bar.wait();
System.out.println("hello world");
// 其他代码
}
}
在一个线程中调用 sleep(long millis) 方法会导致该线程进入休眠状态,即该线程会停止运行 millis 毫秒的时间,但并不代表 millis 毫秒后该线程马上会运行,超时后该线程重新加入到等待队列等待虚拟机调度。
使用场景区别
wait 方法是为了 Reader 和 Writer 之间的协作而 sleep 方法仅仅是对本线程的操作。
为什么出现内存泄漏:Java 的 GC 机制,从 ROOT 开始遍历,对象如果没有价值了就不会再被引用,然而没有价值的对象还被引用就会出现内存泄露。
为什么会出现 OOM:Android 中每个 APP 最少运行在一个进程中, 每个进程或者每个虚拟机有个最大内存限制。APP内存由 dalvik内存 和 native内存 2部分组成,这2部分加起来不能超过android对单个进程,虚拟机的内存限制。
场景:
避免方式:
为什么出现 ANR:Android 中主线程负责处理与用户交互的工作,如果在主线程中做了太多其它的工作(如数据处理),那么太久时间里主线程不能处理 UI 方面的工作,界面太久(5秒)没有更新,就会出现 ANR
场景:
避免方法: