龙空技术网

java开启线程的四种方法 详细说明+代码实现

热爱技术的小郑 45

前言:

目前同学们对“java线程start”大体比较着重,看官们都想要知道一些“java线程start”的相关文章。那么小编同时在网络上汇集了一些有关“java线程start””的相关文章,希望同学们能喜欢,兄弟们一起来学习一下吧!

@[toc]

1、继承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(); * } * */
1.1 代码实现
package com.zyz.mynative.demo03;/** * @author zyz * @version 1.0 * @data 2023/2/15 15:51 * @Description:继承Thread类,重写run方法(不推荐,因为java的单继承局限性) */public class ExtendThread extends Thread {    public static void main(String[] args) {        ExtendThread thread = new ExtendThread();        thread.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接口2.1 方式一:直接实现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(); * } * */
2.1.1 代码实现
package com.zyz.mynative.demo03;/** * @author zyz * @version 1.0 * @data 2023/2/15 15:57 * @Description: */public class RunnableImpl implements Runnable {    public static void main(String[] args) {        RunnableImpl runnable = new RunnableImpl();        Thread thread = new Thread(runnable);        thread.start();        /**         * 简写         * new Thread(runnable).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);        }    }}

2.2 方式二:匿名内部类

/* * 创建步骤如下: * 匿名内部类本质上也是一个类实现了Runnable接口,重写了run方法,只不过这个类没有名字,直接作为参数传入Thread类 * * 调用示例: * //开启10个线程 * for (int i = 0; i < 10; i++) { *     Anonymous anonymous =new Anonymous(); *     anonymous.myRun(); * } * * */
2.2.1 代码实现
package com.zyz.mynative.demo03;/** * @author zyz * @version 1.0 * @data 2023/2/15 15:57 * @Description: */public class RunnableImpl2 {    public static void main(String[] args) {        RunnableImpl2 test = new RunnableImpl2();        test.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接口
/* * 创建步骤如下: * 1,定义实现Callable<V>接口的实现类,实现call方法,这个方法是线程执行体 * 2,创建Callable<V>实现类的实例,借助FutureTask得到线程执行的返回值 * 3,将FutureTask的实例,作为Thread的target来创建Thread类 * 4,调用start方法,开启线程 * * 调用示例: * Callable<String> tc = new CallableImpl(); * FutureTask<String> 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的返回值 * * */
3.1 代码实现
package com.zyz.mynative.demo03;import java.util.concurrent.Callable;import java.util.concurrent.ExecutionException;import java.util.concurrent.FutureTask;/** * @author zyz * @version 1.0 * @data 2023/2/15 16:08 * @Description: */public class CallableImpl implements Callable<String> {    public static void main(String[] args) {        Callable<String> tc = new CallableImpl();        FutureTask<String> task = new FutureTask<>(tc);        new Thread(task).start();        try {            System.out.println(task.get());        } catch (InterruptedException | ExecutionException e) {            e.printStackTrace();        }    }    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、创建线程池

/* * 创建步骤如下: * 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类的子类也可以以线程池的方式开启线程 * * */
4.1 代码实例
package com.zyz.mynative.demo03;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;/** * @author zyz * @version 1.0 * @data 2023/2/15 16:11 * @Description: */public class ThreadPool implements Runnable {    public static void main(String[] args) {      ExecutorService pool = Executors.newFixedThreadPool(2);      ThreadPool threadPool = new ThreadPool("AA");      ThreadPool threadPoo2 = new ThreadPool("BB");      pool.execute(threadPool);      pool.execute(threadPoo2);      pool.shutdown();    }    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);        }    }}

资料参考:创建线程池的实现方法[1]

引用链接

[1] 创建线程池的实现方法:

标签: #java线程start #java run方法何时调用 #java通过什么方法启动线程 #java怎么启动线程 #java启动线程需要使用什么方法