创建线程:
一、1.继承Thread,重写run(),将操作写入其中
2.创建子类对象,start()
二、1.实现runnable接口,实现run()
2.创建子类对象,将子类对象作为参数传递到thread的构造器中,创建出Thread类的对象
3.Thread类的对象调用start()
作用:实现runnable接口,没有单继承的局限性,更适合处理多个线程有共享数据的情况。
三、1.实现Callable接口,实现call(),将操作写入其中,
2.创建实现callable接口的对象,作为参数传递到FutureTask对象中,
3.将FutureTask对象作为参数传递到Thread对象,调用start()
4.获取Callable中call方法的返回值
作用:
四、1.以方式二、三创建好runnable接口或callable的实现类,重写run()或call()
2.创建线程池
3.调用execute()执行某个线程,参数就是实现类
作用:
1.提高了响应速度(减少了创建新线程时间)
2.降低资源消耗(重复利用线程池中的线程,不需要每次都创建)
3.便于线程管理
五、匿名类:再thread对象中,将参数作为一个方法,new一个runnable(),重写run()
run()和start():
run()中包含要执行的线程内容,当run()方法运行结束后,线程随即终止。
start()启动线程,调用start0()进行系统调度资源分配。
直接调用run():相当于调用一个普通方法,并没有启动一个线程。
调用start():线程会进入就绪状态并得到cpu时间片后开始执行run()方法中的任务。
runnable和Callable:
Callable的 call() 方法可以返回值和抛出异常,Callable可以返回装载有计算结果的Future对象。runnable不能