前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >线程的创建

线程的创建

作者头像
黑洞代码
发布2021-01-14 15:44:21
6640
发布2021-01-14 15:44:21
举报

线程的创建

概述

1.Thread类创建线程

2.Runnable接口创建线程

3.Callable接口创建线程

4.线程的生命周期

第1节 Thread类创建线程

可以通过继承Thread的方式创建线程。

1. 定义Thread类的子类,并重写该类的run()方法,该run()方法的方法体就代表了线程需要完成的任务。

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

3. 调用线程对象的start()方法来创建并启动线程。

代码语言:javascript
复制
public class HelloWorldThread extends Thread {

    /**
     * 重写run()方法,run()方法的方法体就是线程的执行体
     */
    @Override
    public void run(){
        System.out.println("Hello Concurrent World");
    }

    public static void main(String[] args) {
        System.out.println("--------创建线程--------");
        HelloWorldThread helloWorldThread = new HelloWorldThread();
        System.out.println("--------启动线程--------");
        helloWorldThread.start();
    }
}

第2节 Runnable接口创建线程

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

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

代码语言:javascript
复制
public class HelloWorldRunnable implements Runnable {
    @Override
    public void run() {
        System.out.println("Hello Concurrent World");
    }

    public static void main(String[] args) {
        System.out.println("--------实现Runnable接口--------");
        HelloWorldRunnable helloWorldRunnable = new HelloWorldRunnable();
        System.out.println("--------创建线程--------");
        Thread thread = new Thread(helloWorldRunnable);
        System.out.println("--------启动线程--------");
        thread.start();

    }
}

第3节 Callable接口创建线程

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

2. 使用FutureTask类来包装Callable对象,该FutureTask对象封装了该Callable对象的call()方法的返回值。

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

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

代码语言:javascript
复制
public class HelloWorldCallable  {
    public static void main(String[] args) {
        // FutureTask对象
        // Lambda表达式
        FutureTask task = new FutureTask(() -> {
            int count = 0;
            for (int i = 0; i <= 100; i++) {
                count += i;
            }
            return count;
        });
        // 创建线程
        Thread thread = new Thread(task);
        // 启动线程
        thread.start();
        try {
            // 获取线程返回值
            System.out.println("1 + 2 + 3 + ... + 100 = " + task.get());
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        }
    }
}

【注意】

除了以上几种方式可以创建线程外,还可以通过线程池创建线程。此处暂不对线程池做过多讲解。

第4节 线程的生命周期

线程从生到死经历的生命周期为:

1. 新建

new关键字创建线程对象时的状态

2. 就绪

通过线程对象的start()方法启动线程时对应的状态,此时线程并不一定马上能进入运行状态,线程的运行由操作系统的调度程序控制。

3. 运行

线程获得CPU的执行权,线程正在执行需要执行的代码

4. 阻塞

BLOCKED称为阻塞状态,或者说线程已经被挂起,线程“睡着”了,原因通常是因为线程在等待一个“锁”。

5. 等待

分为有限期等待和无限期等待

6. 线程结束

线程各状态转换如下图所

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-06-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 落叶飞翔的蜗牛 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档