线程的5种状态:新建(New),就绪(Runnable),运行(Running),阻塞(Blocked),死亡(Dead)
创建方式:继承Thread 实现Runnable 实现Callable 使用Executors问题来了:1. sleep结束后进入什么状态?
就绪状态
2. Runnable和Callable的区别? > Runnable执行方法是run(),Callable是call()
> 实现Runnable接口的任务线程无返回值;实现Callable接口的任务线程能返回执行结果
> call方法可以抛出异常,run方法若有异常只能在内部消化
3. FutureTask是什么
FutureTask futureTask = new FutureTask<>(实现了Callable的类实例);//将任务放进FutureTask里
Thread thread = new Thread(futureTask);
thread.start();
或:
ExecutorService executorService=Executors.newCachedThreadPool();
executorService.submit(futureTask);
executorService.shutdown();
一个FutureTask可以用来包装一个Callable或Runnable对象。因为FutureTask实现了Runnable接口,一个FutureTask可以被提交给一个Executor来执行。
4. Executors创建的几种线程池? ThreadPoolExecutor的参数?
>newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。
> newFixedThreadPool 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。
> newScheduledThreadPool 创建一个定长线程池,支持定时及周期性任务执行。
> newSingleThreadExecutor 创建一个单线程化的线程池执行任务。
public ThreadPoolExecutor (int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit,BlockingQueue workQueue)
> corePoolSize:线程池中所保存的核心线程数,包括空闲线程。
> maximumPoolSize:池中允许的最大线程数。
> keepAliveTime:线程池中的空闲线程所能持续的最长时间。
> unit:持续时间的单位。
> workQueue:任务执行前保存任务的队列,仅保存由execute方法提交的Runnable任务。