• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

Java多线程

武飞扬头像
正经程序员
帮助21

什么是进程?

进程是系统中正在运行的一个程序,程序一旦运行就是进程。进程可以看成程序执行的一个实例。进程是系统资源分配的独立实体,每个进程都拥有独立的地址空间。一个进程无法访问另一个进程的变量和数据结构,如果想让一个进程访问另一个进程的资源,需要使用进程间通信,比如管道,文件,套接字等。

什么是线程?

线程是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程

指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。

线程的实现方式?

  1. 继承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状态:

  1. 线程运行正常结束,结束生命周期。
  2. 线程运行出错意外结束。
  3. JVM Crash导致所有的线程都结束。

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanfbebj
系列文章
更多 icon
同类精品
更多 icon
继续加载