为了账号安全,请及时绑定邮箱和手机立即绑定

多线程编程之线程基础

标签:
Java


前言

此内容是阅读了书籍《JAVA多线程编程核心技术》后作为学习总结的文章,同时也梳理一下内容。建议大家有兴趣都可以阅读一下这本书,对于想了解更多的同学来说是一个很好的教材,同时建议大家多去思考和动手编写代码,融会贯通之后再去看一遍,会有更多的体会。就比如《JVM底层实现最佳实战》的书籍一样,我读了已经不下五遍了,但每次读都能有新的收获一样。希望对大家有帮助。

该篇文章是用于了解多线程的一些基本概念、JDK支持多线程编程的类和方法,接口等。

1.1 进程与线程概念

什么是进程: 

进程是操作系统结构的基础,是一次程序的执行,是程序及其数据结构在处理机上顺序执行时所发生的活动;

是程序在数据集合上运行的过程,它是系统进行资源分配和调度的独立单位。比如说:操作系统中运行的exe就是一个进程。其实进程就是应用。

什么是线程:

线程可以理解为进程中独立运行的子任务。比如QQ.exe运行时,有好友视频线程,文件下载线程,传输数据线程,发送表情线程等等。

1.2 实现多线程编程

JDK开发包中,自带了对多线程技术的支持,可以方便进行多线程编程。

实现多线程编程有多种方式:继承Thread类,实现Runnable接口,Callable接口

1.2.1继承Thread类

在继承Thread类实现多线程编程之前,我们先来看看Thread类结构:

优先级:[1,10]

线程状态:新建、就绪、阻塞、运行、死亡

public enum State {

NEW,

RUNNABLE,

BLOCKED,

WAITING,

TIMED_WAITING,

TERMINATED;

}

态切换图:

多线程编程之线程基础

1.2.2实现Runnable接口

    @FunctionalInterface

    public interface Runnable {

        public abstract void run();

    }

1.2.3实现Callable接口

    @FunctionalInterface

    public interface Callable<V> {

        V call() throws Exception;

    }

1.2.4Runnable与Callable区别

Runnable不可以抛出异常,Callable可以;

Runnable不可以返回结果,Callable可以,结合FutureTask可以拿到结果,但会把当前线程阻塞。

1.2.5实例变量与线程安全

A.不共享数据的情况,不存在这个数据线程安全问题。

B.共享数据的情况,会存在数据线程安全问题。

这个时候需要给run方法加上synchronized关键字,防止线程间操作出现数据错乱。

1.3 currentThread()方法

获取当前线程信息

1.4 isAlive()方法

判断当前的线程是否出于活动状态。

1.5 sleep()方法

指定毫秒数线程休眠

1.6 getId()方法

获取线程唯一标识。

1.7 停止线程

interrupt()方法停止线程,仅仅是当前线程中打一个停止的标志,并不是真的停止线程。

this.interrupted():测试当前线程是否已经中断。 类方法

this.isInterrupted():测试线程是否已经中断。实例方法

异常可以中断线程。

stop暴力停止,已经作废,因为可能导致一些清理性工作得不到完成。另外一个是对锁定的对象进行了解锁导致数据得不到同步处理出现数据不一致的问题。

interrupt()与return结合使用也能实现停止线程。

1.8 暂停线程

暂停线程意味着此线程可以恢复运行。可以使用suspend()方法停止线程,resume()方法恢复线程运行。

但是suspend和resume方法使用不当,容易造成公共的同步对象独占,使得其他线程无法访问公共同步对象,容易导致数据不同步。

1.9 yield方法

yield方法的作用是放弃当前的CPU资源,将让给其他任务去使用CPU。但放弃的时间不确定,有可能马上又获取了CPU的时间片。

1.10 线程的优先级

线程具有优先级具有继承性。

可以通过setPriority()方法可以设置线程优先级。具有规则性:优先级高的总是大部分优先执行完,但不代表高优先级的线程全部执行。

具备随机性:不一定能保障高优先级每次都优先执行。

1.11 线程分类

分为用户线程、守护线程。

守护线程是一种特殊线程,它的线程有陪伴的含义,当进程不存在非守护线程时,则守护线程自动销毁。

比如守护线程最典型的就是GC(垃圾回收器)

总结:

这里主要提到了是线程的基本知识,需要上面有些代码我没有贴出来,主要一个是太简单,另外一个原因是希望读者能够动起手来来自己尝试写代码检测。这样有助于对线程知识加深理解。打完手工,最后希望有兴趣的同学能够看看这本书:《JAVA多线程编程核心技术》、《JAVA并发编程》、《JAVA高级编程》。如果我上面有什么错误希望读者能够留言给我,我会第一时间修改,以防止误导读者。

©著作权归作者所有:来自51CTO博客作者刺激乐天派的原创作品,如需转载,请注明出处,否则将追究法律责任


点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消