1.创建线程一共有哪几种方法?
继承Thread类创建线程
继承Thread类,重写run()方法,在main()函数中调用子类的strat()方法
实现Runnable接口创建线程
先创建实现Runnable接口的类,重写run()方法,创建类的实例对象,将对象作为参数创建Thread对象,调用Thread对象的start()方法。
使用Callable和Future创建线程
创建Callable接口实现的类,重写call()方法,创建该类的实例对象,作为参数创建FutureTast对象,然后以FutureTask对象作为参数创建Thread对象,调用Thread对象的start()方法。
使用线程池创建
使用ThreadPoolExcutor创建线程,可以准确的控制创建的数量、最大等待数量,拒绝策略等
1.corePoolSize 核心池子的数量(大小)默认是先不创建线程,有任务到达后,再创建,之后就不销毁了
2.maximumPoolSize :最大池子数量
3.keepAliveSize:非核心线程池中的线程,在多久之后没有任务执行时销毁
4.TimeUint : 时间单位,7种静态属性
5.workQueue: 等待队列 设置队列数量 20
6.threadFactory :创建线程的工厂
7.Handler 拒绝策略
1.AbortPolicy策略:直接抛出异常
2.CallerPolicy:提交任务的线程执行,
3.DiscardOldestPolicy:丢弃队列中等待时间最长的任务
4.DiscardPolicy:直接丢弃任务,不予理睬
向线程池提交任务有两种方式:
execute:提交实现了Runnable ,没有返回值
submit:提交实现了Runnable和Callable
区别:execute 适用于不需要关注返回值的场景,submit 方法适用于需要关注返 回值的场景。
execute方法执行流程图:
线程池的优点:(模拟面试没有回答上)
1.重复利用线程,降低线程创建和销毁带来的资源消耗2.统一管理线程,线程的创建和销毁都由线程池进行管理3.响应速度,线程创建已经完成,任务来到可直接处理,省去了创建时间
2.线程通信的方法有哪些?