java多线程与线程池-01多线程知识复习

本文详细介绍了Java多线程的基础知识,包括线程与进程的关系、线程的启动方式、线程标识、线程状态及其转换,以及线程安全与共享资源竞争的原理,如synchronized同步、线程通信方法wait()、notify()。此外,还讨论了线程的中断、线程通信工具如CountDownLatch、Exchanger和Semaphore,以及死锁的概念和预防策略。
摘要由CSDN通过智能技术生成

多线程知识复习

第1章 多线程基础

1.1.2 线程与进程的关系

进程可以看成是线程的容器,而线程又可以看成是进程中的执行路径。

1.2 多线程启动

线程有两种启动方式:实现Runnable接口;继承Thread类并重写run()方法。

执行进程中的任务时才会产生线程,因此需要一种描述任务的方式,这可以由Runnable接口来提供。要想定义任务,需要实现Runnable接口并且重写run()方法,然后再将Runnable的实现对象作为参数传递给Thread类。

调用Thread类的start()方法,启动线程,向CPU发出请求,去执行任务。

还可以采用继承Thread类并且重写run()方法,然后调用start()启动线程。

通常情况下,实现Runnable接口然后启动线程是一个更好的选择,这可以提高程序的灵活性和扩展性,并且用Runnable接口描述任务也更容易理解。

1.2.1 线程标识

Thread类用于管理线程,如设置线程优先级、设置Daemon属性、读取线程名字和ID、启动线程任务、暂停线程任务、中断线程等。

为了管理线程,每个线程在启动后都会生成一个唯一的标识符,并且在其生命周期内保持不变当线程被终止时,该线程ID可以被重用。而线程的名字更加直观,但是不具有唯一性。

1.2.2 Thread与Runnable

Runnable接口表示线程要执行的任务。当Runnable中的run()方法执行时,表示线程在激活状态,run()方法一旦执行完毕,即表示任务完成,则线程将被停止。

Thread类默认实现了Runnable接口,并且其构造方法的重载形式允许传入Runnable接口对象作为任务。

通过Thread类的源代码可以发现,线程的两种启动方式,其本质都是实现Thread类中的run()方法而实现Runnable接口,然后传递给Thread类的方式,比Thread子类重写run()方法更加灵活。

1.2.3 run()与start()

调用Thread对象的start()方法,使线程对象开始执行任务,这会触发Java虚拟机调用当前线程对象的run()方法。调用start()方法后,将导致两个线程并发运行,一个是调用start()方法的当前线程,另外一个是执行run()方法的线程。

如果重复调用start()方法,这是一个非法操作,它不会产生更多的线程,反而会导致IllegalThreadStateException异常。

1.2.4 Thread源码分析

创建Thread类实例,首先会执行registerNatives()方法,它在静态代码块中加载。线程的启动、运行、生命期管理和调度等都高度依赖于操作系统,Java本身并不具备与底层操作系统交互的能力。因此线程的底层操作都使用了native方法,registerNatives()就是用C语言编写的底层线程注册方法

无论通过Thread类的哪种构造方法去创建线程,都需要首先调用init()方法,初始化线程环境

在init()方法中,做了如下操作:

(1)设置线程名称。

(2)将新线程的父线程设置为当前线程。

(3)获取系统的安全管理SecurityManager,并获得线程组。SecurityManager在Java中被用来检查应用程序是否能访问一些受限资源,如文件、套接字(socket)等。它可以用在那些具有高安全性要求的应用程序中。

(4)获取线程组的权限检查。

(5)在线程组中增加未启动的线程数量。

(6)设置新线程的属性,包括守护线程属性(默认继承父线程)、优先级(默认继承父线程)、堆栈大小(如果为0,则默认由JVM分配)、线程组、线程安全控制上下文(一种Java安全模式,设置访问控制权限)等。

1.3 线程状态

Java中的线程存在6种状态,分别是NEW、RUNNABLE、BLOCKED、WAITING、TIMED_WAITING、TERMINATED。我们可以通过Thread类中的Thread.getState()方法获取线程在某个时期的线程状态。在给定的时间点,线程只能处于一种状态。

1.3.1 NEW状态

NEW代表着线程新建状态,一个已创建但是未起动(start)的线程处于NEW状态。

1.3.2 RUNNABLE状态

RUNNABLE状态表示一个线程正在Java虚拟机中运行,但是这个线程是否获得了处理器分配资源并不确定。调用Thread的start()方法后,线程从NEW状态切换到了RUNNABLE状态。

1.3.3 BLOCKED状态
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值