首先,有比这三种方法更好的启动或者调用线程的方式。你想呀,如果每个打手各自为战,可能就会出现下面几个缺点:
//咱们自己写的线程类 public class DemoThread extend Thread{ @Override public void run(){ //......具体逻辑...... } } //模拟一下使用(咱们在main()方法中使用一下咱们自己写的线程类) public static void main(String[] args){ DemoThread demoThread = new DemoThread(); //启动线程 demoThread.start(); }
老规矩,买一增一
这种方法的好处和坏处如下:
public class DemoRunnable implements Runnable{ @Override//step1.自写类中重写run方法 public void run(){ //......具体的逻辑...... } } public static void main(String[] args){ DemoRunnable demoRunnable = new DemoRunnable();//step2.自写类实例化后传入new Thread中 new Thread(demoRunnable).start;//step3.自写类实例化后引用传入Thread对象后并调用start方法 }
老规矩,买一赠一,上菜:
public class DemoCallable implements Callable<Integer>{ @Override//step1.自己写的类里面重写call() public Integer call(){ return 123; } } public static void main(String[] args) throws ExecutionException, InterruptedException { //创建异步任务.//step2.将自写类实例化后将引用传入FutureTask中,再实例化FutureTask FutureTask<Integer> futureTask = new Future<Integer>(new DemoCallable()); //step3.再把FutureTask引用传入new Thread中,并启动线程 new Thread(futureTask).start(); try{ //等待任务执行完毕返回结果 String result = futureTask.get(); //打印呀或者干啥随你 } catch(ExceptionException e) { e.printStackTrace(); } }
胡&敏:怎么除了有个run()方法,还有个call()方法,你得给我解释一下:
author:其实就是个方法嘛,(之前咱们知道要是实现接口或者说继承抽象方法时,必须重写其中的抽象方法),我就拿call()方法举例吧。咱们就看看人家call()方法的源码,看看人家方法使用时有啥特性就行,该对应的就给人家对应上就行了呗。你看这里的call()方法的接口的泛型和方法的返回值类型一致
咱们的使用场景就像下面这样:
Notes:call()方法还有个特异功能,可以缓存结果提高程序执行效率,上图:
胡&敏:中中中,大概按照你这三道程序和图片,以后也能自己用了。不过人家老是说启动线程启动线程,这到底是什么意思。
author:上图
后面的几集的内容大概就是这些:
明天同一时间,再见,拜拜~