Java-线程创建的三种方式

1、通过Runnable接口创建线程类

(1)定义runnable接口的实现类,并重写该接口的run()方法,该run()方法的方法体同样是该线程的线程执行体。

(2)创建 Runnable实现类的实例,并以此实例作为Thread的target来创建Thread对象,该Thread对象才是真正的线程对象。

(3)调用线程对象的start()方法来启动该线程。

2、继承Thread类创建线程类

(1)定义Thread类的子类,并重写该类的run方法,该run方法的方法体就代表了线程要完成的任务。因此把run()方法称为执行体。

(2)创建Thread子类的实例,即创建了线程对象。

(3)调用线程对象的start()方法来启动该线程。

3、通过Callable和Future创建线程

(1)创建Callable接口的实现类,并实现call()方法,该call()方法将作为线程执行体,并且有返回值。

public interface Callable
{
  V call() throws Exception;
}

(2)创建Callable实现类的实例,使用FutureTask类来包装Callable对象,该FutureTask对象封装了该Callable对象的call()方法的返回值。(FutureTask是一个包装器,它通过接受Callable来创建,它同时实现了Future和Runnable接口。)

(3)使用FutureTask对象作为Thread对象的target创建并启动新线程。

(4)调用FutureTask对象的get()方法来获得子线程执行结束后的返回值

 

实例:

package ThreadTest;

import org.junit.Test;

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;

public class runable implements Runnable{
    @Override
    public void run() {
        System.out.println("线程A");
    }
    //第一种结实现runnable接口
    @Test
    public void runableTest(){
        Thread t = new Thread(new runable());
        t.start();
    }

    public class ThreadTest extends Thread{
        @Override
        public  void  run(){
            System.out.println("第二种方法:");
        }

    }
    /**
     * 第二种继承 Thread 类 重写run方法
     */
    @Test
    public void threadTest(){
        ThreadTest threadTest = new ThreadTest();
        threadTest.start();
    }
//    第三种 实习callable接口 重写call方法 有返回值
    //返回值类型
    public class Thread3 implements Callable<Object>{

    @Override
    public Object call() throws Exception {
        return "第三种";
    }
}
    @Test
    public void callabletest() throws ExecutionException, InterruptedException {
        //创建Callable的实例
        Thread3 callable = new Thread3();
        //第二步使用FutureTast包装Callable实例
        FutureTask<Object> futureTask = new FutureTask<>(callable);
        //第三步 创建Thread实例
        Thread thread = new Thread(futureTask);
        //启动线程
        thread.start();
        //获取返回值
        String res = (String) futureTask.get();
        System.out.println(res);
    }
}

 

总结:

三种方式最终都是创建Thread实例,通过start()方法启动线程。

第三种方式能将结果返回。(有返回值)

文章已创建 80

发表评论

电子邮件地址不会被公开。 必填项已用*标注

相关文章

开始在上面输入您的搜索词,然后按回车进行搜索。按ESC取消。

返回顶部