Java多线程
什么是进程?
进程是系统中正在运行的一个程序,程序一旦运行就是进程。进程可以看成程序执行的一个实例。进程是系统资源分配的独立实体,每个进程都拥有独立的地址空间。一个进程无法访问另一个进程的变量和数据结构,如果想让一个进程访问另一个进程的资源,需要使用进程间通信,比如管道,文件,套接字等。
什么是线程?
线程是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程
指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。
线程的实现方式?
- 继承Thread类
import java.io.*;
class GFG extends Thread {
public void run()
{
System.out.print("Welcome to GeeksforGeeks.");
}
public static void main(String[] args)
{
GFG g = new GFG(); // creating thread
g.start(); // starting thread
}
}
2.实现Runnable接口
import java.io.*;
class GFG implements Runnable {
public static void main(String args[])
{
// create an object of Runnable target
GFG gfg = new GFG();
// pass the runnable reference to Thread
Thread t = new Thread(gfg, "gfg");
// start the thread
t.start();
// get the name of the thread
System.out.println(t.getName());
}
@Override public void run()
{
System.out.println("Inside run method");
}
}
3.还可以使用Callable和Future创建线程,Runnable 中缺少的一个特性就是当 run() 完成时,不能返回结果,也就是线程终止时不能返回结果。为了支持此功能,Java 中存在 Callable 接口。
为了实现 Runnable,需要实现 run() 方法,它不返回任何内容,而对于 Callable,需要实现 call() 方法,它在完成时返回结果。请注意,不能使用 Callable 创建线程,只能使用 Runnable 创建线程。
另一个区别是 call() 方法可以抛出异常,而 run() 不能。
创建线程的好处:
- 与进程相比,Java 线程更轻量级;创建线程需要更少的时间和资源。
- 线程共享其父进程的数据和代码。
- 线程通信比进程通信简单。
- 线程之间的上下文切换通常比进程之间的切换便宜。
Thread类中的start()和run()方法的区别
使用start()方法启动线程,真正实现了多线程运行。无需等待run方法体代码执行完毕,可以直接继续执行下面的代码。通过调用Thread类的start()方法来启动一个线程,这时此线程是处于就绪状态,并没有运行。
然后通过此Thread类调用方法run()来完成其运行操作的,这里方法run()称为线程体,它包含了要执行的这个线程的内容,Run方法运行结束,此线程终止。然后CPU再调度其它线程。run()方法是当作普通方法的方式调用。程序还是要顺序执行,要等待run方法体执行完毕后,才可继续执行下面的代码。
程序中只有主线程一这一个线程,其程序执行路径还是只有一条,这样就没有达到写线程的目的。
线程状态
NEW状态:new创建一个Thread对象时,并没处于执行状态,因为没有调用start方法启动改线程,那么此时的状态就是新建状态。
RUNNABLE状态:线程对象通过start方法进入runnable状态,启动的线程不一定会立即得到执行,线程的运行与否要看spu的调度,我们把这个中间状态叫可执行状态(RUNNABLE).
RUNNING状态:一旦spu通过轮询货其他方式从任务可以执行队列中选中了线程,此时它才能真正的执行自己的逻辑代码。
BLOCKED状态:进入BLOCKED状态,比如调用了sleep,或者wait方法,进行某个阻塞的io操作,比如因网络数据的读写进入BLOCKED状态,获取某个锁资源,从而加入到该锁的阻塞队列中而进入BLOCKED状态。
TERMINATED状态:TERMINATED是一个线程的最终状态,在该状态下线程不会再切换到其他任何状态了,代表整个生命周期都结束了。
下面几种情况会进入TERMINATED状态:
- 线程运行正常结束,结束生命周期。
- 线程运行出错意外结束。
- JVM Crash导致所有的线程都结束。
本篇文章来至:学新通
- 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
- 本站站名: 学新通
- 本文地址: https://www.swvq.com/boutique/detail/tanfbebj
- 联系方式: luke.wu#vfv.cc
-
photoshop保存的图片太大微信发不了怎么办
PHP中文网 06-15 -
word第二行和第一行不能对齐怎么办
PHP中文网 06-20 -
怎样阻止微信小程序自动打开
PHP中文网 06-13 -
表格输入身份证号码后三位显示0怎么办
PHP中文网 06-21 -
photoshop默认安装在c盘怎么移动
PHP中文网 03-29 -
photoshop扩展功能面板显示灰色怎么办
PHP中文网 06-14 -
pr做好的序列不见了怎么办
PHP中文网 05-12 -
word表格分成了上下两块怎么办
PHP中文网 06-17 -
excel下拉菜单选择后怎么自动出现相应内容
PHP中文网 06-24 -
excel图片置于文字下方的方法
PHP中文网 06-27