一、继承Thread类 重写run()方法
二、实现Runnable接口 实现run()方法-----不能返回值、不能抛出异常
三、实现Callable接口 重写call()方法--------返回值 抛异常
第三种方式需要借助FutureTask来使用:new Thread(new FutureTask(new MyCallable())).start() ; FutureTask中get()方法获取返回值
Thread(Runnable r)-----Thread构造方法
FutureTase实现了Runnable
注意:只有执行get()方法时才会触发异常抛出
get()方法是一个阻塞方法
一个FutureTask中call方法只会被执行一次