1.实现多线程的三种方式:
①继承Thread类
②实现runnable接口
③通过futureTask包装器来创建Thread线程
特点:可以返回值
public class FutureTask<V> implements RunnableFuture<V>
public interface RunnableFuture<V> extends Runnable, Future<V> {
使用Callable方式,需要Futertask的支持
public FutureTask(Callable<V> callable) {
if (callable == null)
throw new NullPointerException();
this.callable = callable;
this.state = NEW; // ensure visibility of callable
}
注意:
并行不一定比串行快:
因为线程有创建上下文切换的开销
并发编程可以用到的小工具:
使用:
Lmbench可以测量上下文切换的时长
vmstat 可以测量上下文切换的次数
jstack 命令dump线程信息
怎么减少上下文切换:
1、无锁并发编程
2、CAS算法
3、使用最少线程和使用协程
死锁:
避免死锁的几种常见方法:
1、避免一个线程同时获取多个锁
2、避免一个线程在锁内同时占用多个资源
3、尝试使用定时锁&