首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >JAVA多线程

JAVA多线程

作者头像
可爱见见
发布2019-09-09 16:15:59
7530
发布2019-09-09 16:15:59
举报
文章被收录于专栏:卡尼慕卡尼慕

线程与进程

进程

如图,引用中有7个进程。随便打开一个进程,如安全管家。

这里的红框内就包含了病毒查杀,首页体检,垃圾清理和电脑加速这几个线程

进程:进程指正在运行的程序。确切的来说,当一个程序进入内存运行,即变成一个进程,进程是处于运行过程中的程序,并且具有一定独立功能。

线程:线程是进程中的一个执行单元,负责当前进程中程序的执行,一个进程中至少有一个线程。一个进程中是可以有多个线程的,这个应用程序也可以称之为多线程程序。

一个程序运行后至少有一个进程,一个进程中可以包含多个线程。

单线程与多线程

单线程程序:要等待上一个线程完成才能进行下一个线程,也就是依次进行。

多线程程序:多个任务可以同时进行,如百度云网盘可以多个任务同时下载。

主线程

当我们启动JVM虚拟机,加载.class文件时,虚拟机会从main方法开始执行代码。当main中有一个很大的循环时,在这个循环没执行完全之前,下面的代码是不会运行的。

即,JVM启动后,必然有一个执行路径(线程)从main方法开始的,一直执行到main方法结束,这个线程在java中称之为主线程。

创建线程的两种方式

A、继承Thread类

创建线程的步骤:

1 定义一个类继承Thread。

2 重写run方法。

3 创建子类对象,就是创建线程对象。

4 调用start方法,开启线程并让线程执行,同时还会告诉jvm去调用run方法

如果需要获取线程名称,可以通过下面两个方法。

Thread.currentThread()获取当前线程对象

Thread.currentThread().getName();获取当前线程对象的名称

上图来自博客,讲述了多线程中的内存图解。

B、实现Runnable接口

创建线程的步骤。

1、定义类实现Runnable接口。

2、覆盖接口中的run方法。。

3、创建Thread类的对象

4、将Runnable接口的子类对象作为参数传递给Thread类的构造函数。

5、调用Thread类的start方法开启线程。

线程池

是一个容纳多个线程的容器,其中的线程可以反复使用,省去了频繁创建线程对象的操作,无需反复创建线程而消耗过多资源。

使用线程池方式--Runnable接口

Executors:线程池创建工厂类

ExecutorService:线程池类

Future接口:用来记录线程任务执行完毕后产生的结果。线程池创建与使用

l使用线程池中线程对象的步骤:

1、创建线程池对象

2、创建Runnable接口子类对象

3、提交Runnable接口子类对象

4、关闭线程池

public class ThreadPoolDemo {
    public static void main(String[] args) {
        //创建线程池对象
        ExecutorService service = Executors.newFixedThreadPool(2);//包含2个线程对象
        //创建Runnable实例对象
        MyRunnable r = new MyRunnable();

        //自己创建线程对象的方式
        //Thread t = new Thread(r);
        //t.start(); ---> 调用MyRunnable中的run()

        //从线程池中获取线程对象,然后调用MyRunnable中的run()
        service.submit(r);
        //再获取个线程对象,调用MyRunnable中的run()
        service.submit(r);
        service.submit(r);
//注意:submit方法调用结束后,程序并不终止,是因为线程池控制了线程的关闭。将使用完的线程又归还到了线程池中

//关闭线程池
        //service.shutdown();
    }
}

public class MyRunnable implements Runnable {
    @Override
    public void run() {
        System.out.println("我要一个教练");

        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("教练来了: " +Thread.currentThread().getName());
        System.out.println("教我游泳,交完后,教练回到了游泳池");
    }
}

使用线程池方式—Callable接口

Callable接口:与Runnable接口功能相似,用来指定线程的任务。其中的call()方法,用来返回线程任务执行完毕后的结果,call方法可抛出异常。

ExecutorService:线程池类

Future接口:用来记录线程任务执行完毕后产生的结果。

线程池创建与使用。

1、使用线程池中线程对象的步骤:

2、创建线程池对象

3、创建Callable接口子类对象

4、提交Callable接口子类对象

5、关闭线程池

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

本文分享自 卡尼慕 微信公众号,前往查看

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档