创建线程有哪几种方式?直接调用 run() 和调用 start() 有什么区别?
先自己想一想,再看参考要点
参考要点
- 实现 Runnable、实现 Callable、继承 Thread,实际开发中更常把任务提交给线程池
- Callable 的 call() 可以有返回值、可以抛出受检异常,要包装成 FutureTask 交给 Thread,用 get() 等待结果
- 实现接口更好:Java 不支持多重继承,而且任务与线程解耦,可以交给线程池执行
- 调用 start() 后 JVM 才向操作系统创建线程(Linux 上是 pthread_create)并分配线程栈,新线程获得 CPU 后执行 run()
- 直接调用 run() 只是在当前线程中执行一个普通方法,同一个 Thread 对象只能 start() 一次,再次调用抛出 IllegalThreadStateException