1、定义线程任务方法:
- 继承Thread,共享变量用static修饰。局限:单继承
- 实现Runnable,解决①的多实现。局限:无返回值,无法抛异常
- 实现Callable:解决①的多实现,解决②的返回值、异常 class A extends Thread { public void run() {任务}} class B implements Runnable { public void run() {任务}} class C implements Callable<String> {public String call() throws Exception {任务}}
2、创建线程
-
new Thread(new A/B/C)
-
线程池ex=Executors.newFixedThreadPool(线程数量) ex.execute(new B)
3、启动线程
-
new A().start 或 new Thread(重写run).start
-
new Thread(new B()).start
-
FutureTask target =new FutureTask(new C());new Thread(target).start();
4、线程切换
- 线程CPU时间片用完
- 垃圾回收
- 等待/阻塞
5、线程状态(五种)
这个应该都会吧,这里省略,只简单说说阻塞
阻塞:
- 等待阻塞wait-->等待队列,释放锁
- 同步阻塞lock-->锁池
- 其他阻塞sleep/join-->不释放锁
6、线程终止的四种方式
其他都不建议,太强制性,建议使用 thread.interrupt() 中断线程
7、礼让、优先级、守护
- Thread.yield() 当前线程礼让
- thread.setPriority() 设置当前线程优先级
- thread.setDaemon(true) 设置当前线程为守护线程,默认都是非守护。java进程需要等待所有线程都运行结束,才会结束,而守护线程,当所有的非守护线程都结束后,即使它没有执行完,也会强制结束,比如垃圾回收线程
8、四种线程池
- Executors.newCachedThreadPool() 创建一个可根据需要创建新线程的线程池
- Executors.newFixedThreadPool(n) 创建一个可重用固定线程数的线程池
- Executors.newSingleThreadExecutor() :创建一个只有一个线程的线程池
- Executors.newScheduledThreadPool(n) 创建一个线程池,它可安排在给定延迟
挖个坑,关于锁,以后专门开一栏