java中怎么实现多线程 ,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。
一、概述
1. 进程
2. 线程
进程中独立的控制单元称为线程。
线程控制进程的执行。
进程中只要有一个线程在执行,进程就不会结束。
一个进程中至少存在一个线程。
3. 多线程
Java 虚拟机启动时,会有一个 java.exe 的执行程序,也就是一个进程。
这个进程中至少存在一个线程负责 java 程序的执行,这个线程的运行代码存在 main 方法中,这个线程称之为主线程。
JVM 启动时除了执行一个主线程,还会启动负责垃圾回收机制的线程。
在一个进程中有多个线程执行的方式,称为多线程。
4. 多线程的意义
5. CPU 运行的原理
PC 上有很多程序“同时”进行,看起来好像是 CPU “同时”处理所有程序似的,其实在同一时刻,单核的 CPU 只能运行一个程序,看起来“同时”运行的效果,实际上只是 CPU 在多个线程之间做快速切换的动作而已。
CPU 执行哪个程序,或者说是哪个程序抢到了 CPU 的执行权,哪个程序就执行,CPU 不会只执行一个线程,执行完一个后,会执行另一个,或者说是另一个线程抢走了 CPU 的执行权。至于如何执行是由 CPU 所决定。
CPU 执行哪个程序,是毫无规律的,这是多线程的特性:随机性。
二、创建方式
创建线程的方式:继承和实现。
1. 继承
2. 实现
使用继承 Thread 创建线程的方式有弊端,就是如果类继承了其它的父类,就无法使用 Thread 来创建线程,于是便有了通过实现 Runnable 接口来创建线程。实现 Runnable 接口,重写(覆盖)run 方法,创建线程。
步骤:
start 方法会自动调用 Runnable 子类的 run 方法。
将 Runnable 的子类对象传递给 Thread 的构造函数的原因:
自定义的 run 方法所属的对象是 Runnable 的子类对象,要让线程去指定对象的 run 方法,就必须明确 run 方法所属的对象。
自定义代码存储在 run 方法中,让线程执行。
定义类实现 Runnable;
重写(覆盖)Runnable 中的 run 方法;
通过 Thread 类创建线程对象。
将 Runnable 的子类对象作为实际参数传递给 Thread 的构造函数;
调用 Thread 中的 start 方法启动线程。
好处:避免了单继承的局限性。(定义线程时,建议优先使用)
例如:

结果如下:

注:线程是随机、交替执行的,每次运行的结果都不同。
三、区别及状态
1. 创建方式的区别
2. 状态

四、安全问题
1. 原因
2. 同步
对于线程的安全问题,在对多条操作共享数据的语句时,只让一个线程执行完,再让下个线程去执行,每条线程在执行的过程中,其它线程都不可以参与执行。
Java 中提供了专业的解决办法 —— synchronized(同步)。
解决的方式:同步代码块和同步函数。(均是使用关键字 synchronized 实现)
同步代码块

前提:
必须有两个或以上的线程;
必须是多个线程使用同一个锁。
利与弊:
利:解决了多线程的安全问题。
弊:多个线程均需要判断锁,消耗资源,影响效率。
如何寻找多线程的安全问题?
明确共享数据;
明确哪些代码是多线程运行的代码;
明确多线程运行的代码中哪些语句是操作共享数据的。
3. 静态函数的同步

4. 死锁

说明:程序卡死,无法继续执行。
五、通信

问题点:
需要唤醒对方线程时,如果只用 notify(),容易出现只唤醒本方线程的情况,会导致程序中所有线程都处于等待状态。
wait():释放 CPU 的执行权,释放同步锁。
sleep():释放 CPU 的执行权,不释放同步锁。
例如:同一个锁上 wait 的线程,只能被同一个锁上的 notify 唤醒。
这些方法存在于同步中;
使用这些方法时必须要有标识所属的同步锁;
锁可以是任意的对象,任意对象调用的方法一定要定义在 Object 类中。
wait()、notify()、notifyAll() 用来操作线程的,为什么是定义在 Object 类中呢?
wait() 和 sleep() 有什么区别呢?
为什么要定义 notifyAll()?
JDK 5 及以上版本中提供了多线程同步锁的升级解决方案


特殊情况:当线程处于冻结状态时,无法读取到 run() 方法中的代码,线程就无法停止。

七、什么情况需要多线程?

八、拓展
join();
setPriority();
MIN_PRIORITY:最低优先级 1
MAX_PRIORITY:最高优先级 10
NORM_PRIORITY:默认优先级
设置优先级:
yield();
关于java中怎么实现多线程 问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注天达云行业资讯频道了解更多相关知识。