JAVA开启线程的四种方法

1,继承Thread类

继承Thread类,重写run方法(不推荐,因为java的单继承局限性)

public class ExtendThread extends Thread {

    /*
    * 创建步骤如下:
    * 1,定义Thread类的子类,并重写该类的run()方法,该run()方法的方法体就代表了线程需要完成的任务。因此把run方法称为线程执行体。
    * 2,创建Thread子类了的实例,即创建线程对象。本实例中是new一个ExtendThread,即可创建线程对象,也就是开启了一个线程
    * 3,调用线程对象的start()方法来启动该线程。
    *
    * 调用示例:
    * //循环10次即开启10个线程
    * for (int i = 0; i < 10; i++) {
    *     ExtendThread extendThread = new ExtendThread();
    *     extendThread.start();
    * }
    * */

    /**
     * 重写Thread类的run(),这个方法称为线程执行体
     * */
    @Override
    public void run() {
        doSomething();
    }

    /**
     * 需要处理的任务
     * */
    public void doSomething(){
        for (int i = 0; i < 10; i++) {
            System.out.println(Thread.currentThread().getName() + "执行" + i);
        }
    }
}

2,实现Runnable接口

方式一:直接实现Runnable接口(避免单继承的局限性,方便共享资源,推荐使用)

public class RunnableImpl implements Runnable {

    /*
    * 创建步骤如下:
    * 1,定义Runnable接口的实现类,并且实现run方法,这个方法同样是线程执行体
    * 2,创建Runnable实现类的实例,并以此实例对象作为Thread的target来创建Thread类,这个新创建的Thread对象才是真正的线程对象,即开启了新的线程
    * 3,调用线程对象的start()方法来开启该线程
    *
    * 调用示例:
    * //开启10个线程
    * for (int i = 0; i < 10; i++) {
    *     Thread thread = new Thread(new RunnableImpl());
    *     thread.start();
    * }
    * */

    /**
     * 实现Runnable接口的run方法,这个方法称为线程执行体
     * */
    @Override
    public void run() {
        doSomething();
    }

    /**
     * 需要处理的任务
     * */
    private void doSomething(){
        for (int i = 0; i < 10; i++) {
            System.out.println(Thread.currentThread().getName() + "执行" + i);
        }
    }
}

方式二:匿名内部类

public class Anonymous {

    /*
    * 创建步骤如下:
    * 匿名内部类本质上也是一个类实现了Runnable接口,重写了run方法,只不过这个类没有名字,直接作为参数传入Thread类
    *
    * 调用示例:
    * //开启10个线程
    * for (int i = 0; i < 10; i++) {
    *     Anonymous anonymous =new Anonymous();
    *     anonymous.myRun();
    * }
    *
    * */

    public void myRun(){
        new Thread(new Runnable() {
            @Override
            public void run() {
                doSomething();
            }
        }).start();
    }

    /**
     * 需要处理的任务
     * */
    private void doSomething(){
        for (int i = 0; i < 10; i++) {
            System.out.println(Thread.currentThread().getName() + "执行" + i);
        }
    }
}

3,实现Callable接口

public class CallableImpl implements Callable {

    /*
     * 创建步骤如下:
     * 1,定义实现Callable接口的实现类,实现call方法,这个方法是线程执行体
     * 2,创建Callable实现类的实例,借助FutureTask得到线程执行的返回值
     * 3,将FutureTask的实例,作为Thread的target来创建Thread类
     * 4,调用start方法,开启线程
     *
     * 调用示例:
     * Callable tc = new CallableImpl();
     * FutureTask task = new FutureTask<>(tc);
     * new Thread(task).start();
     * try {
     *     System.out.println(task.get());
     * } catch (InterruptedException | ExecutionException e) {
     *     e.printStackTrace();
     * }
     *
     * 说明:
     * 1.与使用Runnable相比, Callable功能更强大些
     * 2.实现的call()方法相比run()方法,可以返回值
     * 3.方法可以抛出异常
     * 4.支持泛型的返回值
     * 5.需要借助FutureTask类,比如获取返回结果
     * Future接口可以对具体Runnable、Callable任务的执行结果进行取消、查询是否完成、获取结果等。
     * FutureTask是Futrue接口的唯一的实现类
     * FutureTask 同时实现了Runnable, Future接口。它既可以作为Runnable被线程执行,又可以作为Future得到Callable的返回值
     *
     * */

    private int ticket = 5;

    @Override
    public String call() throws Exception {
        for (int i = 0; i < 10; i++) {
            System.out.println(doSomething());
        }

        return "出票任务完成";
    }

    public String doSomething() {
        String result = "";
        if (this.ticket > 0) {
            result = "出票成功,ticket=" + this.ticket--;
        } else {
            result = "出票失败,ticket=" + this.ticket;
        }
        return result;
    }
}

4,创建线程池

public class ThreadPool implements Runnable {

    /*
     * 创建步骤如下:
     * 1,定义Runnable接口的实现类,或者定义(继承Runnable接口的类)的实现类,并且实现run方法,这个方法是线程执行体
     * 2,创建一个自定义线程个数的线程池
     * 3,实例化Runnable接口的实现类
     * 4,将3步的实例,作为线程池实例的execute方法的command参数,开启线程
     * 5,关闭线程池
     *
     * 调用示例:
     * ExecutorService pool = Executors.newFixedThreadPool(2);
     * ThreadPool threadPool = new ThreadPool("AA");
     * ThreadPool threadPoo2 = new ThreadPool("BB");
     * pool.execute(threadPool);
     * pool.execute(threadPoo2);
     * pool.shutdown();
     *
     * 说明:
     * 示例中创建的是2个线程的线程池
     * execute方法是开启线程方法,实参要求是实现Runnable的类。所以,继承Thread类的子类也可以以线程池的方式开启线程
     *
     * */

    String name;
    public ThreadPool(String name) {
        this.name = name;
    }

    @Override
    public void run() {
        doSomething();
    }

    /**
     * 需要处理的任务
     * */
    private void doSomething() {
        for (int i = 0; i < 10; i++) {
            System.out.println(Thread.currentThread().getName() + "执行" + i + ",name=" + this.name);
        }
    }
}

你可能感兴趣的:(java,开发语言,后端,多线程)