Document

创建线程的方式

一、创建线程的第一种方式:

继承Thread ,由子类复写run方法。

步骤:

1,定义类继承Thread类;

2,目的是复写run方法,将要让线程运行的代码都存储到run方法中;

3,通过创建Thread类的子类对象,创建线程对象;

4,调用线程的start方法,开启线程,并执行run方法。

public class ThreadDemo extends Thread{

    @Override
    public void run() {
        System.out.println("====thread=====");
    }

    public static void main(String[] args) {
        ThreadDemo threadTest1=new ThreadDemo();
        threadTest1.start();
    }
}

二、创建线程的第二种方式:

实现一个接口Runnable。

步骤:

1,定义类实现Runnable接口。

2,覆盖接口中的run方法(用于封装线程要运行的代码)。

3,通过Thread类创建线程对象;

4,将实现了Runnable接口的子类对象作为实际参数传递给Thread类中的构造函数。

为什么要传递呢?因为要让线程对象明确要运行的run方法所属的对象。

5,调用Thread对象的start方法。开启线程,并运行Runnable接口子类中的run方法。

public class RunableTest{

    public static void main(String[] args) {
        Thread thread=new Thread(new RunableDemo());
        thread.start();
    }
}

class RunableDemo implements Runnable{
    @Override
    public void run() {
        System.out.println("======runnable=======");
    }
}

 

三、创建线程的第三种方式:

实现一个接口Callable

步骤:

1,定义类实现Callable接口。

2,覆盖接口中的call方法(用于封装线程要运行的代码)。

3,通过FutureTask来创建对象,用于接收运算结果;

4,将实现了Callable接口的子类对象作为实际参数传递给FutureTask类中的构造函数;

5,通过Thread类创建线程对象;

6,将FutureTask对象作为实际参数传递给Thread类中的构造函数;

7,调用Thread对象的start方法。开启线程,并运行Callable接口子类中的call方法;

8,通过Future对象的get方法获取结果。

/**
 * 1、创建线程式三:实现Callable接口。相较于Runnable接口的方式,方法可以有返回值,并且可以抛出异常。
2、执行Callable方式,需要FutureTask实现类的支持,用于接收运算结果。FutureTask是RunnableFuture接口的实现类,
 RunnableFuture接口继承了Runnable, Future接口
3.FutereTask也可用于闭锁操作
 */
public class CallableTest {

    public static void main(String[] args) throws ExecutionException, InterruptedException {
        CallableDemo cd=new CallableDemo();
        FutureTask<Integer>  ft1=new FutureTask(cd);
        new Thread(ft1,"线程a").start();
        //如果想再起一个线程,得重新创建一个newFutureTask,不然线程不会执行。
        FutureTask<Integer>  ft2=new FutureTask(cd);
        new Thread(ft2,"线程b").start();

        int number=200;
        System.out.println("----------------");
        //如果做计算,建议放最下面,避免阻塞
        //要求获得Callable线程的计算结果,如果没有计算完成就会阻塞,直到计算完成
        Integer sum1=ft1.get();
        Integer sum2=ft2.get();
        System.out.println("线程a===="+sum1);
        System.out.println("线程b===="+sum2);
        System.out.println("线程a+num:"+(sum1+number));
    }
}

class CallableDemo implements Callable<Integer> {
    @Override
    public Integer call() throws Exception {
        System.out.println(Thread.currentThread().getName()+" 进入Callable");
        int sum=0;
        for(int i=0;i<=100;i++){
            sum+=i;
        }
        return sum;
    }
}

 四、创建线程的第四种方式:线程池

posted @ 2020-02-16 18:24  马宝云  阅读(137)  评论(0编辑  收藏  举报