当前位置:网站首页 >> 作文 >> 2023年java线程的生命周期详解 java线程的生命周期有几个阶段优质

2023年java线程的生命周期详解 java线程的生命周期有几个阶段优质

格式:DOC 上传日期:2023-04-30 20:50:17
2023年java线程的生命周期详解 java线程的生命周期有几个阶段优质
时间:2023-04-30 20:50:17     小编:zdfb

每个人都曾试图在平淡的学习、工作和生活中写一篇文章。写作是培养人的观察、联想、想象、思维和记忆的重要手段。那么我们该如何写一篇较为完美的范文呢?接下来小编就给大家介绍一下优秀的范文该怎么写,我们一起来看一看吧。

java线程的生命周期详解 java线程的生命周期有几个阶段篇一

线程是程序中一个单一的顺序控制流程。进程内一个相对独立的、可调度的执行单元,是系统独立调度和分派cpu的基本单位指运行中的程序的调度单位。下面是小编分享的java线程的生命周期,一起来看一下吧。

在java程序中创建线程有几种方法。每个java程序至少包含一个线程:主线程。其它线程都是通过thread构造器或实例化继承类thread的类来创建的。

java线程可以通过直接实例化thread对象或实例化继承thread的对象来创建其它线程。在线程基础中的示例(其中,我们在十秒钟之内计算尽量多的素数)中,我们通过实例化calculateprimes类型的对象(它继承了thread),创建了一个线程。

当我们讨论java程序中的线程时,也许会提到两个相关实体:完成工作的实际线程或代表线程的thread对象。正在运行的线程通常是由操作系统创建的;thread对象是由javavm创建的,作为控制相关线程的一种方式。

创建线程和启动线程并不相同

在一个线程对新线程的thread对象调用start()方法之前,这个新线程并没有真正开始执行。thread对象在其线程真正启动之前就已经存在了,而且其线程退出之后仍然存在。这可以让您控制或获取关于已创建的线程的信息,即使线程还没有启动或已经完成了。

通常在构造器中通过start()启动线程并不是好主意。这样做,会把部分构造的对象暴露给新的`线程。如果对象拥有一个线程,那么它应该提供一个启动该线程的start()或init()方法,而不是从构造器中启动它。(请参阅参考资料,获取提供此概念更详细说明的文章链接。)

java线程会以以下三种方式之一结束:

java线程到达其run()方法的末尾。

java线程抛出一个未捕获到的exception或error。

另一个java线程调用一个弃用的stop()方法。弃用是指这些方法仍然存在,但是您不应该在新代码中使用它们,并且应该尽量从现有代码中除去它们。

当java程序中的所有线程都完成时,程序就退出了。

加入java线程

threadapi包含了等待另一个线程完成的方法:join()方法。当调用()时,调用线程将阻塞,直到目标线程完成为止。

()通常由使用线程的程序使用,以将大问题划分成许多小问题,每个小问题分配一个线程。本章结尾处的示例创建了十个线程,启动它们,然后使用()等待它们全部完成。

除了何时使用()()外,线程调度和执行的计时是不确定的。如果两个线程同时运行,而且都不等待,您必须假设在任何两个指令之间,其它线程都可以运行并修改程序变量。如果线程要访问其它线程可以看见的变量,如从静态字段(全局变量)直接或间接引用的数据,则必须使用同步以确保数据一致性。

在以下的简单示例中,我们将创建并启动两个线程,:

classtwothreads{

staticclassthread1extendsthread{

voidrun(){

n("a");

n("b");

6.}

7.}

staticclassthread2extendsthread{

voidrun(){

n("1");

n("2");

12.}

13.}

staticvoidmain(string[]args){

ead1().start();

ead2().start();

17.}

18.}

我们并不知道这些行按什么顺序执行,只知道“1”在“2”之前打印,以及“a”在“b”之前打印。输出可能是以下结果中的任何一种:

12ab

1a2b

1ab2

a12b

a1b2

ab12

不仅不同机器之间的结果可能不同,而且在同一机器上多次运行同一程序也可能生成不同结果。永远不要假设一个线程会在另一个线程之前执行某些操作,除非您已经使用了同步以强制一个特定的执行顺序。

休眠

threadapi包含了一个sleep()方法,它将使当前线程进入等待状态,直到过了一段指定时间,或者直到另一个线程对当前线程的 upt(),从而中断了线程。当过了指定时间后,线程又将变成可运行的,并且回到调度程序的可运行线程队列中。

upt()的调用而中断的,那么休眠的线程会抛出interruptedexception,这样线程就知道它是由中断唤醒的,就不必查看计时器是否过期。

()()一样,但它并不引起休眠,而只是暂停当前线程片刻,这样其它线程就可以运行了。在大多数实现中,()时,较低优先级的线程就不会运行。

calculateprimes示例使用了一个后台线程计算素数,然后休眠十秒钟。当计时器过期后,它就会设置一个标志,表示已经过了十秒。

我们提到过当java程序的所有线程都完成时,该程序就退出,但这并不完全正确。隐藏的系统线程,如垃圾收集线程和由jvm创建的其它线程会怎么样?我们没有办法停止这些线程。如果那些线程正在运行,那么java程序怎么退出呢?

这些系统线程称作守护程序线程。java程序实际上是在它的所有非守护程序线程完成后退出的。

任何线程都可以变成守护程序线程。mon()方法来指明某个线程是守护程序线程。您也许想要使用守护程序线程作为在程序中创建的后台线程,如计时器线程或其它延迟的事件线程,只有当其它非守护程序线程正在运行时,这些线程才有用。

示例:用多个java线程分解大任务

在这个示例中,tenthreads显示了一个创建了十个线程的程序,每个线程都执行一部分工作。该程序等待所有线程全部完成,然后收集结果。

19./**

20.*createstenthreadstosearchforthemaximumvalueofalargematrix.

21.*eachthreadsearchesoneportionofthematrix.

22.*/

classtenthreads{

estaticclassworkerthreadextendsthread{

=_value;

[]ourarray;

workerthread(int[]ourarray){

ay=ourarray;

29.}

30.//findthemaximumvalueinourparticularpieceofthearray

3voidrun(){

(inti=0;i

=(max,ourarray[i]);

34.}

intgetmax(){

max;

37.}

38.}

3staticvoidmain(string[]args){

thread[]threads=newworkerthread[10];

[][]bigmatrix=getbighairymatrix();

=_value;

43.//giveeachthreadasliceofthematrixtoworkwith

(inti=0;i<10;i++){

s[i]=newworkerthread(bigmatrix[i]);

s[i].start();

47.}

48.//waitforeachthreadtofinish

{

(inti=0;i<10;i++){

s[i].join();

=(max,threads[i].getmax());

53.}

54.}

(interruptedexceptione){

56.//fallthrough

57.}

n("maximumvaluewas"+max);

59.}

60.}

就象程序一样,线程有生命周期:它们启动、执行,然后完成。一个程序或进程也许包含多个线程,而这些线程看来互相单独地执行。

线程是通过实例化thread对象或实例化继承thread的对象来创建的,但在对新的thread对象调用start()方法之前,这个线程并没有开始执行。当线程运行到其run()方法的末尾或抛出未经处理的异常时,它们就结束了。

sleep()方法可以用于等待一段特定时间;而join()方法可能用于等到另一个线程完成。

s("content_relate");

【java线程的生命周期】相关文章:

java多线程介绍

12-07

java多线程教程

11-21

java线程编程中的主线程详细介绍

11-25

java单线程多线程的实现与方法

12-05

java多线程之线程间的通信方式解析

11-25

java多线程的开发技巧

11-11

java多线程的基本使用

11-10

什么是java主线程

12-07

关于java多线程介绍

11-22

全文阅读已结束,如果需要下载本文请点击

下载此文档
a.付费复制
付费获得该文章复制权限
特价:5.99元 10元
微信扫码支付
已付款请点这里
b.包月复制
付费后30天内不限量复制
特价:9.99元 10元
微信扫码支付
已付款请点这里 联系客服