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种方法\

Thread


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();
    }

}