线程的创建

线程的两种创建方式

package com.xwl;
public class Testthread {
    public static void main(String[] args) {
        /*通过继承Thread类来创建并启动多线程的一般步骤如下
        1】d定义Thread类的子类,并重写该类的run()方法,该方法的方法体就是线程需要完成的任务,run()方法也称为线程执行体。
        2】创建Thread子类的实例,也就是创建了线程对象
        3】启动线程,即调用线程的start()方法
        代码实例*/
        new MyThread().start();//创建线程并启动线程
/*      通过实现Runnable接口创建并启动线程一般步骤如下
        1】定义Runnable接口的实现类,一样要重写run()方法,这个run()方法和Thread中的run()方法一样是线程的执行体
        2】创建Runnable实现类的实例,并用这个实例作为Thread的target来创建Thread对象,这个Thread对象才是真正的线程对象
        3】第三部依然是通过调用线程对象的start()方法来启动线程*/
        MyThread2 mt = new MyThread2();
        Thread thread = new Thread(mt);
        thread.start();
    }
}
class MyThread extends Thread{
    public void run() { 
        System.out.println("hello tread");
    }
}
//这个类相当于是个任务,创建这个任务,然后把这个任务交给一个线程,
    //如果没有任务就不会创建
class MyThread2 implements Runnable{
    public void run() {
        System.out.println("hello Runnable");
    }
}

上述两种创建方式一种是继承Thread类,一种是实现Runnable接口,需要注意的是实现Runnable接口的类其实是一个任务,我们可以创建这个任务,然后把这个任务放到一个线程中,让线程执行。

线程的第三种创建方式

package com.xwl;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;
/**
 * 线程的第三种实现方式
 * @author Administrator
 */
public class TestCallable {
    public static void main(String[] args) throws InterruptedException, ExecutionException {
        //创建任务
        MyThread3 mythread3 = new MyThread3();
         //1.执行 Callable 方式,需要 FutureTask 实现类的支持,用于接收运算结果。
        FutureTask<Integer> result = new FutureTask<Integer>(mythread3);
        new Thread(result).start();//创建线程并开启线程
        //FutureTask 可用于 闭锁 类似于CountDownLatch的作用,在所有的线程没有执行完成之后这里是不会执行的
        Integer sum = result.get();
        System.out.println(sum);        
    }
}
class MyThread3 implements Callable<Integer>{
    public Integer call() throws Exception {
        int sum = 0;
        for (int i = 0; i < 3; i++) {
            sum += i;
        }
        return sum;
    }
}

这种创建方式是针对于需要线程返回值得线程而创建的,我们实现Callable接口,实现call()方法,返回一个返回值,实际上这跟实现Runnable类似,这种方式同样也是创建一个任务,这个任务有一个返回值,我们需要用FutureTask来接收这个返回值,FutureTask中有一个有参构造方法,我们把Callable的任务给它,然后,就会得到这个任务的返回值result。
最后我们通过把这个result扔给一个线程,调用start()方法就可以开启线程执行任务了,我们可以在执行后调用result.get() 就可以获取到该任务执行后的结果。

总结

1.继承Thread类实现run()方法,就是创建了一个线程,run() 方法中的实现就是我们需要让该线程实现的任务。
2.实现Runnable接口,实现run()方法,实际上我们是创建了一个任务,这个任务需要借助一个线程来执行,我们只需要把这个任务给一个线程即可。它的优点在于我们在有需要的时候才创建任务,然后把这个任务给某一个线程去执行(比如说扔给线程池,线程池找一个空闲的线程或者创建一个线程来执行这个任务,任务执行完就回到线程池或者定期销毁线程)。
3.实现Callable接口,实现call()方法与实现Runnable接口类似,唯一不同的是我们创建的同样是一个任务,它有一个返回值,我们new这个任务,用FutureTask接收到这个result结果,最终我们把这个结果仍给一个线程,这个样的话我们可以在线程执行之后通过 result.get()获取到线程执行的结果。

猜你喜欢

转载自blog.csdn.net/xwl_java/article/details/82078589