Java线程详解(深度好文)

发布时间:2021-12-13 11:12:26
java线程:概念与原理。
一、进程与线程。
过程是指在内存中运行的应用程序。每个过程都有自己独立的内存空间,即过程空间或(虚拟空间)。该过程不依赖于线程,而是独立存在。多个线程可以在一个过程中启动。例如,在Windows系统中,运行的exe是一个过程。

 
 
线程是指一个执行过程,可以在一个过程中运行多个线程。例如,许多线程可以在java.exe过程中运行。线程总是属于一个过程,线程没有自己的虚拟地址空间,与过程中的其他线程共享并分配给过程中的所有资源。
同时执行是人的感觉,实际上在线程之间轮换执行。
执行过程中有独立的内存单元,有独立的地址空间,多个线程共享内存,大大提高了程序的运行效率。
线程在执行过程中与过程不同。每个独立的线程都有一个程序操作的入口。顺序执行序列和程序出口。但是,线程不能独立执行,必须依靠应用程序,应用程序提供多个线程执行控制。
该过程是一个具有一定独立功能的程序,它是一个独立的单位,系统分配和调度资源。
线程是过程的实体,是CPU调度和分配的基本单位,是比过程小的可以独立运行的基本单位。线程本身基本上没有系统资源,只有一点运行中必不可少的资源(如程序计数器、一组寄存器和堆栈),但它可以与其他属于同一过程的线程共享所有资源。
线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间。线程包含以下内容:
指向当前执行指令的指令指针;
一个栈;
寄存器值的集合定义了部分描述执行线程的处理器状态的值。
私有数据区。
我们用Join()方法挂起当前线程,直到调用Join()方法的线程完成。该方法还有一个包含参数的重载版本,用于指定等待线程结束的最长时间(即超时)所花费的毫秒。如果线程中的工作在规定的超时期内结束,版本的Join()方法将返回布尔量True。
简而言之:
一个程序至少有一个过程,一个过程至少有一个线程。
线程的划分尺度小于进程,使得多进程的并发性高。
此外,该过程在执行过程中有独立的内存单元,多个线程共享内存,大大提高了程序的运行效率。
线程在执行过程中与过程不同。每个独立的线程都有一个程序操作的入口。顺序执行序列和程序出口。但是,线程不能独立执行,必须依靠应用程序,应用程序提供多个线程执行控制。
从逻辑上讲,多线程的意义在于,在一个应用程序中,多个执行部分可以同时执行。然而,操作系统并没有将多个线程视为多个独立应用程序来实现过程调度、管理和资源分配。这是过程和线程之间的重要区别。
在Java中,每个程序运行至少启动两个线程:一个是main线程,另一个是垃圾收集线程。因为每当使用java命令执行一个类时,实际上都会启动JVM,每个JVM实际上都会在操作系统中启动一个过程。
二、Java中的线程。
在Java中,线程是指两件不同的事情:
1.java.lang.Thread类的实例;
2.执行线程。
创建Java程序有两种方法:
一是派生Thread并覆盖run的方法;
二是创建Runnable接口。
使用java.lang.thread类或java.lang.runnable接口编写代码进行定义。实例化并启动新线程。
Thread类实例只是一个对象,就像Java中的任何其他对象一样,它有变量和方法,生死在堆上。
在Java中,每个线程都有一个调用栈,即使不在程序中创建任何新的线程,线程也在后台运行。
Java应用程序总是从main()方法开始,main()方法在一个线程中运行,称为主线程。
一旦创建了新的线程,就会产生新的调用栈。
线程一般分为用户线程和等待线程两类。
当所有用户线程完成时,JVM将自动关闭。但等待线程不独立于JVM,通常由操作系统或用户创建。
Java线程:创建和启动。
定义线程。
扩展java.lang.Thread类。
有一种run()方法,应注意其用法:publicvoidrun()
如果线程采用独立的Runnable运行对象构造,则调用Runnable对象的Run方法;否则,该方法将不执行任何操作并返回。
该方法应重写Thread的子类。
实现java.lang.Runnable接口。
()voidrun)
使用实现接口Runnable的对象创建线程时,启动线程将导致在独立执行的线程中调用对象的Run方法。
方法run的常规协议是,它可以执行任何所需的操作。
二、实例化线程。
1.如果是扩展java.lang.Thread类线程,可以直接new。
2.如果实现了java.lang.Runnable接口类,则采用Thread的结构方法:
viewplaincopy[java]。
Thread(Runnabletarget)
Thread(Runnabletarget,stringname)
Thread(ThreadGroupgroup,Runabletarget)
Thread(ThreadGroupgroup,Runnabletarget,Stringname)
Thread(ThreadGroupgroup、Runabletarget、Stringname、longstackSize)
其中:
Runnabletarget:实现Runnable接口类的实例。
Thread类也实现了Runnable接口,因此,从Thread类继承的类的实例也可以作为target传入这种结构方法。
Runnable接口类的实例直接实现。
建立多线程线程池。
Stringname:线程名称。该名称可以在建立Thread实例后通过ThreadsetName设置。默认线程名称:Thread-N,N是线程建立的顺序,是不重复的正整数。
ThreadGroupgroup:目前建立的线程所属的线程组。如果没有指定线程组,所有线程都添加到默认线程组中。
longstacksize:线程栈的大小,一般是CPU页面的整数倍。比如x86的页面大小。
上一篇 Java并发编程:如何创建进程?
下一篇 【图灵干货】Jvm如何加载类?如何分配空间?