Java多线程编程初探

多线程编程


大家好,我是IT修真院深圳分院第5期的学员,一枚正直纯洁善良的Java程序员
今天给大家分享一下,修真院官网Java任务1基础部分的多线程讲解。

1.背景介绍

多线程(英语:multithreading),是指从软件或者硬件上实现多个线程并发执行的技术。

具有多线程能力的计算机因有硬件支持而能够在同一时间执行多于一个线程, 进而提升整体处理性能。

具有这种能力的系统包括对称多处理机、多核心处理器以及芯片级多处理(Chip-level multithreading)或同时多线程(Simultaneous multithreading)处理器。

在一个程序中,这些独立运行的程序片段叫作“线程”(Thread),利用它编程的概念就叫作“多线程处理(Multithreading)”。

具有多线程能力的计算机因有硬件支持而能够在同一时间执行多于一个线程,进而提升整体处理性能。

2.知识剖析

Java中的线程实现:

1.继承Thread类

在java.lang包中定义, 继承Thread类必须重写run()方法。创建好了自己的线程类之后,就可以创建线程对象了,然后通过start()方法去启动线程。

注意,不是调用run()方法启动线程,run方法中只是定义需要执行的任务。

如果调用run方法,即相当于在主线程中执行run方法,跟普通的方法调用没有任何区别,此时并不会创建一个新的线程来执行定义的任务。

2.实现Runnable接口

在Java中创建线程除了继承Thread类之外,还可以通过实现Runnable接口来实现类似的功能。实现Runnable接口必须重写其run方法。

事实上,查看Thread类的实现源代码会发现Thread类是实现了Runnable接口的。

在Java中,这2种方式都可以用来创建线程去执行子任务,具体选择哪一种方式要看自己的需求。

直接继承Thread类的话,可能比实现Runnable接口看起来更加简洁,但是由于Java只允许单继承,所以如果自定义类需要继承其他类,则只能选择实现Runnable接口。

3.使用ExecutorService、Callable、Future实现有返回结果的多线程

线程的状态

创建(new)状态: 准备好了一个多线程的对象

就绪(runnable)状态: 调用了start()方法, 等待CPU进行调度

运行(running)状态: 执行run()方法

阻塞(blocked)状态: 暂时停止执行, 可能将资源交给其它线程使用

终止(dead)状态: 线程销毁

3.常见问题

进程与线程之间的区别

4.解决方案

进程与线程

每个正在系统上运行的程序都是一个进程。每个进程包含一到多个线程。进程也可能是整个程序或者是部分程序的动态执行。

线程是一组指令的集合,或者是程序的特殊段,它可以在程序里独立执行。也可以把它理解为代码运行的上下文。

所以线程基本上是轻量级的进程,它负责在单个程序里执行多任务。通常由操作系统负责多个线程的调度和执行。

5.编码实战

6.扩展思考

Thread和Runnable的区别

因为Thread本来就是实现了Runnable,包含Runnable的功能是很正常的啊!!

至于两者的真正区别最主要的就是一个是继承,一个是实现;其他还有一些面向对象的思想,Runnable就相当于一个作业,而Thread才是真正的处理线程。

我们需要的只是定义这个作业,然后将作业交给线程去处理,这样就达到了松耦合,也符合面向对象里面组合的使用。

另外也节省了函数开销,继承Thread的同时,不仅拥有了作业的方法run(),还继承了其他所有的方法。

综合来看,用Runnable比Thread好的多。

7.参考文献

文章链接:https://blog.csdn.net/u013755987/article/details/51855098

文章作者:开心coding开心playing

文章链接:https://www.cnblogs.com/yjd_hycf_space/p/7526608.html

文章作者:鸿燕藏锋

8.更多讨论

1.多线程有什么用?

多线程的意思就是多个线程一起去协同完成一个大的任务,通过充分去共享资源来达到提升效率的一种编程思想。当我们使用单线程的时候,一次性只能完成一个任务或者一个细节,而且任务或者细节之间有着严格的秩序。但是在面对大量不相关的任务或者细节的时候,我们可以使用多线程来一次性执行多个任务或者细节,以达到提升效率的效果。

2.线程的优先级是怎么安排的?

J
ava线程的优先级从1到10级别,值越大优先级越高

java的优先级从1到10级别,值越大优先级越高。

3.为什么优先级高的并不一定先执行?

大家可以看这个博主的解释:https://blog.csdn.net/qpzkobe/article/details/79273975

1、java线程是通过映射到系统的原生线程上来实现的,所以线程的调度最终还是取决于操作系统,操作系统的优先级与java的优先级并不一一对应,如果操作系统的优先级级数大于java的优先级级数(10级)还好,但是如果小于得的话就不行了,这样会导致不同优先级的线程的优先级是一样的。 
2、优先级可能会被系统自动改变,比如windows系统中就存在一个优先级推进器,大致功能就是如果一个线程执行的次数过多的话,可能会越过优先级为他分配执行时间

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值