前两种很常见,给出第三种的代码实现
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
场景:
避免方法: