Thread
知识点:有三种方式创建线程(第三种不常见但是要了解哦)
1:extens Thread,重写run方法
2:implement runable,在创建Thread对象,重写run方法(推荐理由:单extend多implement)
启动线程:只有.start(),才会开始线程
priority(默认5,1-10)
多线程不是提高执行速度,而是提高应用程序的使用率
采用抢占式调度模型(而不是分时调度),也就是看谁抢的cpu时间片牛逼
Thread.Sleep的Exception只能Try-catch(因为没有更宽泛的异常了)
笔记本上有一道面试题很经典!说的和Static有关
Synchronized:有两种锁法
1:直接给对象上锁,还需要同步监听器(只用共同对象才有用哦),然后写同步的代码;(推荐)
2:给方法上锁:安全性高,不需要指定同步监听器(因为就是对象本身),因为方法里还有好多代码,都上锁了肯定不好呀
过程:第一线程访问的时候,开始锁定同步监听器,执行代码;当第二线程访问的时候,发现同步监听器被锁,等着
LOck(显示锁)和Synchronized(隐示锁)
:LOck只能锁代码块,最后还得Lock.close();
线程通信:wait(),notify(),notifyAll()
用户线程结束,守护线程才结束
线程池:创建多个线程,放入池中,使用时直接获取,不用时放入,可以避免频繁的创建销毁,实现了重复利用,因为创建时需要分配内存等资源,销毁时虽然不需要程序员关心,当GC会一直跟踪并销毁
遇到Factory时,说明不需要new!!!
遇到线程池出现问题时:丢掉、等、抛异常3种方法\
public class ThreadPool {
public static void main(String[] args) throws InterruptedException, ExecutionException {
// 创建一个固定线程的池 提供n个线程
ExecutorService pool = Executors.newFixedThreadPool(100);
// 存储线程执行的结果
List<Future> fs = new ArrayList<Future>();
// 使用20个线程执行任务
for (int i = 0; i < 200; i++) {
// 创建一个新线程
Callable<Integer> task = new RandomCallable();
// 执行这个线程 返回结果
Future<Integer> f = pool.submit(task);
// 把结果存到集合里
fs.add(f);
}
// 遍历结果
for (Future<Integer> f : fs) {
System.out.println(f.get());
}
pool.shutdown();
}
}