创建线程的三种方式
创建线程有三种方式,分别是继承Thread类、实现Runnable接口、实现Callable接口。
1.通过继承Thread类来创建并启动线程的步骤如下:
1.1定义Thread类的子类,并重写该类的run()方法,该run()方法将作为线程执行体。
1.2创建Thread子类的实例,即创建了线程对象。
1.3调用线程对象的start()方法来启动该线程。
2.通过实现Runnable接口来创建并启动线程的步骤如下:
2.1定义Runnable接口的实现类,并实现该接口的run()方法,该run()方法将作为线程执行体。
2.2创建Runnable实现类的实例,并将其作为Thread的target来创建Thread对象,Thread对象为线程对象。
2.3调用线程对象的start()方法来启动该线程。
3.通过实现Callable接口来创建并启动线程的步骤如下:
3.1创建Callable接口的实现类,并实现call()方法,该call()方法将作为线程执行体,且该call()方法有返回值。然后再创建Callable实现类的实例。
3.2使用FutureTask类来包装Callable对象,该FutureTask对象封装了该Callable对象的call()方法的返回值。
3.3使用FutureTask对象作为Thread对象的target创建并启动新线程。
3.4调用FutureTask对象的get()方法来获得子线程执行结束后的返回值。
代码
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;
class MyThread extends Thread{
@Override
public void run(){
System.out.println(Thread.currentThread().getName());
}
}
class MyThread1 implements Runnable{
@Override
public void run() {
System.out.println(Thread.currentThread().getName());
}
}
class MyThread2 implements Callable{
@Override
public Object call() throws Exception {
return "success";
}
}
public class ThreadTest {
public static void main(String[] args) throws ExecutionException {
for(int i=0;i<10;i++){
//继承Thread类
//new MyThread().start();
//实现Runnable接口
//new Thread(new MyThread1()).start();
//实现Callable接口
FutureTask<String> task = new FutureTask<>(new MyThread2());
new Thread(task).start();
try {
System.out.println(task.get());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}