一 继承Thread类
这种方式不常用,因为继承了Thread类后,就不能继承其他类了(Java单继承)
1. 调用start方法的流程
2. 直接调用run方法的流程
二 实现Runnable接口
这种方式更加常用,因为实现Runnable接口后,还可以继承其他类(Java单继承的限制)
public class ThreadTest {
public static void main(String[] args) {
//创建分支线程对象
MyRunnable myRunnable=new MyRunnable();
Thread t=new Thread(myRunnable);
//启动分支线程
t.start();
for(int i=0;i<2000;i++){
System.out.println("主线程执行了----"+i);
}
}
}
class MyRunnable implements Runnable{
public void run() {
for(int i=0;i<2000;i++){
System.out.println("分支线程执行了----"+i);
}
}
}
三 实现Callable接口
package dom.bipowernode.test14;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;
/**
* 创建线程的第三种方式,实现Callable接口
*/
public class ThreadTest14 {
public static void main(String[] args) throws ExecutionException, InterruptedException {
//1.创建一个未来任务类
FutureTask ft=new FutureTask(new MyCallable());
//2. 创建一个线程对象
Thread t=new Thread(ft);
//3. 启动线程
t.start();
//4. 获取分支线程执行结果
Object res = ft.get();//执行这行代码会造成主线程阻塞,因为必须等分支线程执行结束,才能拿到返回结果,这行代码才算执行结束
System.out.println(Thread.currentThread().getName()+"执行结束");
}
}
class MyCallable implements Callable<Object>{
public Object call() throws Exception {
System.out.println(Thread.currentThread().getName()+" begin");
Thread.sleep(1000*10);
System.out.println(Thread.currentThread().getName()+" end");
int a=100;
int b=200;
return a+b;//自动装箱
}
}