实现线程的第一种方式:
-
编写一个类,直接继承java.lang.Thread,重写run方法
-
//定义线程类 public class MyThread extends Thread{ public void run(){ } } //创建线程对象 MyThread t = new MyThread(); //启动线程 t.start();
怎么创建线程对象?new
-
怎么启动线程?
-
调用线程对象的start() 方法
-
start() 方法的作用是:启动一个分支线程,在JVM中开辟一个新的栈空间,这段代码任务完成之后,瞬间就结束了。这段代码的任务只是为了开启一个新的栈空间,只要新的栈空间开出来了。start()方法就结束了。线程就启动成功了。run方法在分支栈的栈底部,main方法在主栈的栈底部。run和main是平级的
-
-
注意
- 亘古不变的道理:方法体中的代码永远都是自上而下的顺序执行的
实现线程的第二种方式
-
编写一个类,实现java.lang.Runnable接口,实现run方法
-
//定义一个可运行的类 public class MyRunnable implements Runnable{ public void run(){ } } //创建线程对象 Thread t = new Thread(new MyRunnable()); //启动线程 t.start();
注意:第二种方式实现接口比较常用,因为一个类实现了接口,它还可以去继承其他的类,更灵活
实现线程的第三种方式:
- 实现Callable接口
- 优点:可以获取到线程的执行结果
- 缺点:效率比较低,在获取其他线程执行结果的时候,当前线程受阻塞,效率较低
FutureTask task = new FutureTask(new Callable(){
public Object call() throws Exception { //call()方法就相当于run方法,只不过这个有返回值
//线程执行一个任务,执行之后可能会有一个执行结果
System.out.println("call method begin");
Thread.sleep(1000 * 10);
System.out.println("call method end");
int a = 100;
int b = 200;
return a + b; //自动装箱(300结果变成Integer)
}
})