博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
多线程基础
阅读量:6955 次
发布时间:2019-06-27

本文共 2366 字,大约阅读时间需要 7 分钟。

进程和线程概念

进程:资源分配的基本单位。

线程:独立调度的基本单位,一个进程中可以包含多个线程,它们之间共享进程资源,同一进程中线程切换不会引发进程切换,不同进程中的线程切换会引发进程切换。

为什么要使用多线程?

多线程的是指在同一时刻有多条执行路径,目的是为了提高程序的运行效率。

多线程应用场景:

多线程下载、数据库连接池、分批发送短信等。

多线程的创建方式

继承 Thread(不建议使用,因为 Java 支持多继承)

class ThreadDemo1 extends Thread {    @Override    public void run() {        for (int i = 0; i < 100; i++) {            try {                Thread.sleep(100);            } catch (InterruptedException e) {                e.printStackTrace();            }            System.out.println(i);        }    }        public static void main(String[] args) throws InterruptedException {        ThreadDemo1 threadDemo1 = new ThreadDemo1();        threadDemo1.start();           }}

实现 Runable 接口

public class ThreadDemo2 implements Runnable {    @Override    public void run() {        for (int i = 0; i < 100; i++) {            try {                Thread.sleep(100);            } catch (InterruptedException e) {                e.printStackTrace();            }            System.out.println(i);        }    }    public static void main(String[] args) {        ThreadDemo1 threadDemo1 = new ThreadDemo1();        new Thread(threadDemo1).start();    }}

使用匿名内部类

public class ThreadDemo3 {    public static void main(String[] args) {        Thread thread = new Thread(new Runnable() {            @Override            public void run() {                for (int i = 0; i < 100; i++) {                    try {                        Thread.sleep(1000);                    } catch (InterruptedException e) {                        e.printStackTrace();                    }                }            }        });        thread.start();    }}

常用线程 API 方法:

  • start() 启动线程
  • currentThread() 获取当前线程对象
  • getID() 获取当前线程ID,Thread-编号,该编号从0开始
  • getName() 获取当前线程名称
  • sleep(long mill) 休眠线程
  • stop() 停止线程

常用线程构造函数

  • Thread() 分配一个新的 Thread 对象
  • Thread(String name) 分配一个新的 Thread对象,具有指定的 name正如其名。
  • Thread(Runable r) 分配一个新的 Thread对象
  • Thread(Runable r, String name) 分配一个新的 Thread对象

多线程状态

守护线程和非守护线程

守护线程:和主线程相关,跟随主线的消亡而消亡,GC(回收主线程垃圾的线程) 线程就是一个典型的守护线程

非守护线程:用户线程(用户创建的线程)跟主线程无关,主线程销毁后,用户线程继续执行,可以通过 setDaemon(true) 将一个非守护线程声明成守护线程

线程让步

join()

当一个线程调用了 join 方法,其他线程要让权给该线程,让这个线程先执行

setPriority()

通过一个整型数控制优先级,优先级用 1~10,1的优先级最低,默认为5,只能表示紧急程度,能不能抢到资源不一定

Thread.yield()

当一个线程使用了这个方法之后,它就会把自己CPU执行的时间让掉,让自己或者其它的线程运行,注意是让自己或者其他线程运行,并不是单纯的让给其他线程

同步和异步概念

单线程:代码从上往下执行,顺序执行

同步:代码从上往下执行

异步:新的一条执行路径,不会影响其他线程

转载地址:http://nbtil.baihongyu.com/

你可能感兴趣的文章
SVN Server配置详解 及备份
查看>>
常用API接口签名验证参考
查看>>
MultipartEntityBuilder.addTextBody 中文乱码
查看>>
ASP.NET页面传值加号变空格解决办法
查看>>
Tarjan算法
查看>>
Linux中find常见用法示例
查看>>
DWZ中Tree树形菜单的treeCheck如何获取返回值解决方案
查看>>
Qt::ConnectionType(信号与槽的传递方式)
查看>>
bootstrap 模态框动态加载数据
查看>>
Android应用程序进程启动过程(前篇)
查看>>
初始化构造函数中定义的实体集合,方便嵌套类型的遍历
查看>>
[转]说说JSON和JSONP,也许你会豁然开朗,含jQuery用例
查看>>
Zygote进程【1】——Zygote的诞生
查看>>
深入理解css3中nth-child和 nth-of-type的区别
查看>>
Spring MVC学习笔记——引入静态文件
查看>>
MySQL慢查询Explain Plan分析
查看>>
MyBatis原理分析之三:初始化(配置文件读取和解析)
查看>>
AndroidStudio非法字符: '\ufeff'解决
查看>>
GC是如何回收SoftReference对象的
查看>>
\Temporary ASP.NET Files\root\文件不断增长,如何处理?
查看>>