victory的博客

长安一片月,万户捣衣声

0%

Java | 创建线程的三种方式

创建线程的三种方式

创建线程有三种方式,分别是继承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();
            }
        }    
    }
}