导航:首页 > 编程语言 > java线程生命周期

java线程生命周期

发布时间:2022-04-26 15:59:51

java 线程有哪些状态,这些状态之间是如何转化的

线程在它的生命周期中会处于各种不同的状态:
新建、等待、就绪、运行、阻塞、死亡。
1 新建
用new语句创建的线程对象处于新建状态,此时它和其他java对象一样,仅被分配了内存。
2等待
当线程在new之后,并且在调用start方法前,线程处于等待状态。
3 就绪
当一个线程对象创建后,其他线程调用它的start()方法,该线程就进入就绪状态。处于这个状态的线程位于Java虚拟机的可运行池中,等待cpu的使用权。
4 运行状态
处于这个状态的线程占用CPU,执行程序代码。在并发运行环境中,如果计算机只有一个CPU,那么任何时刻只会有一个线程处于这个状态。
只有处于就绪状态的线程才有机会转到运行状态。
5 阻塞状态
阻塞状态是指线程因为某些原因放弃CPU,暂时停止运行。当线程处于阻塞状态时,Java虚拟机不会给线程分配CPU,直到线程重新进入就绪状态,它才会有机会获得运行状态。
6 死亡状态
当线程执行完run()方法中的代码,或者遇到了未捕获的异常,就会退出run()方法,此时就进入死亡状态,该线程结束生命周期。

由于java线程调度不是分时的,如果程序希望干预java虚拟机对线程的调度过程,从而明确地让一个线程给另外一个线程运行的机会,可以采用以下的方法
1 调整各个线程的优先级
2 让处于运行状态的线程调用Thread.sleep(long time)方法 放弃CPU 进入阻塞状态。
sleep方法可能抛出InterruptedException
线程休眠后只能在指定的时间后使线程处于就绪状态。(也就是等待cpu的调度)
3 让处于运行状态的线程调用Thread.yield()方法 只会同优先级让步或更高优先级让步,进入就绪状态。
4 让处于运行状态的线程调用另一个线程的join()方法
当前运行的线程可以调用另一个线程的join()方法,当前运行的线程将转到阻塞状态,直至另一个线程运行结束,它才会转到就绪状态 从而有机会恢复运行。

通过一下几种途径中的一种,线程可以从被阻塞状态到可运行状态。
1 线程被置于睡眠状态,且已经经过指定的毫秒数。
2 线程正在等待I/O操作的完成,且该操作已经完成。
3 线程正在等待另一个线程所持有的锁,且另一个线程已经释放该锁的所有权;(也有可能等待超时。当超时发生时,线程解除阻塞。)
4 线程正在等待某个触发条件,且另一个线程发出了信号表明条件已经发生了变化。(如果为线程的等待设置了一个超时,那么当超时发生时该线程将解除阻塞。)
5 线程已经被挂起,且有人调用了它的resume方法。不过,由于suspend方法已经过时,resume方法也就随之被弃用了,你不应该在自己的代码里调用它。(现在应该用sleep取而代之。)

㈡ 基于java 线程的几种状态

下面是java 线程的5种状态:

1、新建(new)

新建一个线程的对象。

2、可运行(runable)

线程对象创建后,其他线程调用该线程的start方法。或者该线程位于可运行线程池中等待被线程调用,已获取cpu的使用权。

3、运行(running)

可运行的线程获取了cpu的使用权,执行程序代码

4、阻塞(block)

由于某些原因该线程放弃了cpu的使用权。停止执行。除非线程进入可运行的状态,才会有机会获取cpu的使用权。

(1)等待阻塞:运行中的线程执行wait方法,这时候该线程会被放入等待队列。

(2)同步阻塞:运行中的线程获取同步锁,如果该同步锁被别的线程占用,这个线程会成被放入锁池,等待其他线程释放同步锁。

(3)其他阻塞:运行的线程执行sleep或者join方法这个线程会成为阻塞状态。当sleep超时,join等待线程终止,该线程会进入可运行状态。

5、死亡(dead)

线程run mian 执行完毕后,或者因为某些异常产生退出了 run 方法,该线程的生命周期结束。

㈢ JAVA:线程的生命周期是什么

1、一个线程的的生命周期可以分成两阶段:生存周期和死亡周期,其中生存周期又包括运行状态和等待状态.当创建一个新线程后,这个线程就进入了排队状态,当线程中的方法start()被调用时,线程就进入生存周期,这时它的方法isAlive()始终返回真值,直至线程进入死亡状态。
2、有两种方法可以实现线程,一种是扩展java.lang.Thread类,另一种是通过java.lang.Runnable接口
3、范例
import java.awt.*;
class Sample1{
public static void main(String[] args){
Mythread test1=new Mythread(1);
Mythread test2=new Mythread(2);
test1.start();
test2.start();
}
}
class Mythread extends Thread {
int id;
Mythread(int i)
{ id=i;}
public void run() {
int i=0;
while(id+i==1){
try {sleep(1000);
} catch(InterruptedException e) {}
}
System.out.println(“The id is ”+id);
}

㈣ Java开发有哪些不同的线程生命周期

当在Java程序中新建一个线程时,它的状态是New。当调用线程的start()方法时,状态被改变为Runnable。线程调度器会为Runnable线程池中的线程分配CPU时间并且讲它们的状态改变为Running。其他的线程状态还有Waiting,Blocked和Dead。

㈤ JAVA中,线程有哪五个基本状态 他们之间如何让转化 简述线程周期

java中,每个线程都需经历新生、就绪、运行、阻塞和死亡五种状态,线程从新生到死亡的状态变化称为生命周期。
用new运算符和Thread类或其子类建立一个线程对象后,该线程就处于新生状态。
新生--->就绪:通过调用start()方法
就绪--->运行:处于就绪状态的线程一旦得到CPU,就进入运行状态并自动调用自己的run()方法
运行--->阻塞:处于运行状态的线程,执行sleep()方法,或等待I/O设备资源,让出CPU并暂时中止自己运行,进入阻塞状态
阻塞--->就绪:睡眠时间已到,或等待的I/O设备空闲下来,线程便进入就绪状态,重新到就绪队列中等待CPU。当再次获得CPU时,便从原来中止位置开始继续运行。
运行--->死亡:(1)(正常情况下)线程任务完成
(2)(非正常状况)线程被强制性的中止,如通过执行stop()或destroy()方法来终止一个线程

㈥ JAVA中,线程有哪五个基本状态他们之间如何让转化并简述线程周期。

java中,每个线程都需经历新生、就绪、运行、阻塞和死亡五种状态,线程从新生到死亡的状态变化称为生命周期。
用new运算符和Thread类或其子类建立一个线程对象后,该线程就处于新生状态。



㈦ java 多线程怎么深入

并发与并行

并行,表示两个线程同时做事情。

并发,表示一会做这个事情,一会做另一个事情,存在着调度。单核 CPU 不可能存在并行(微观上)。

image

以上就是原生线程池创建的核心原理。除了原生线程池之外并发包还提供了简单的创建方式,上面也说了它们是对原生线程池的一种包装,可以让开发者简单快捷的创建所需要的线程池。

Executors

newSingleThreadExecutor

创建一个线程的线程池,在这个线程池中始终只有一个线程存在。如果线程池中的线程因为异常问题退出,那么会有一个新的线程来替代它。此线程池保证所有任务的执行顺序按照任务的提交顺序执行。

newFixedThreadPool

创建固定大小的线程池。每次提交一个任务就创建一个线程,直到线程达到线程池的最大大小。线程池的大小一旦达到最大值就会保持不变,如果某个线程因为执行异常而结束,那么线程池会补充一个新线程。

newCachedThreadPool

可根据实际情况,调整线程数量的线程池,线程池中的线程数量不确定,如果有空闲线程会优先选择空闲线程,如果没有空闲线程并且此时有任务提交会创建新的线程。在正常开发中并不推荐这个线程池,因为在极端情况下,会因为 newCachedThreadPool 创建过多线程而耗尽 CPU 和内存资源。

newScheledThreadPool

此线程池可以指定固定数量的线程来周期性的去执行。比如通过 scheleAtFixedRate 或者 scheleWithFixedDelay 来指定周期时间。

PS:另外在写定时任务时(如果不用 Quartz 框架),最好采用这种线程池来做,因为它可以保证里面始终是存在活的线程的。

推荐使用 ThreadPoolExecutor 方式

在阿里的 Java 开发手册时有一条是不推荐使用 Executors 去创建,而是推荐去使用 ThreadPoolExecutor 来创建线程池。

这样做的目的主要原因是:使用 Executors 创建线程池不会传入核心参数,而是采用的默认值,这样的话我们往往会忽略掉里面参数的含义,如果业务场景要求比较苛刻的话,存在资源耗尽的风险;另外采用 ThreadPoolExecutor 的方式可以让我们更加清楚地了解线程池的运行规则,不管是面试还是对技术成长都有莫大的好处。

改了变量,其他线程可以立即知道。保证可见性的方法有以下几种:

  • volatile

  • 加入 volatile 关键字的变量在进行汇编时会多出一个 lock 前缀指令,这个前缀指令相当于一个内存屏障,内存屏障可以保证内存操作的顺序。当声明为 volatile 的变量进行写操作时,那么这个变量需要将数据写到主内存中。

    由于处理器会实现缓存一致性协议,所以写到主内存后会导致其他处理器的缓存无效,也就是线程工作内存无效,需要从主内存中重新刷新数据。

    ㈧ 辅以图示简述Java线程的生命周期

    //这是线程被中断,同生命周期的代码,希望帮到你啦!
    class MyThread implements Runnable {
    @Override
    public void run() {
    System.out.println("1、进入run()方法休眠");
    try {
    System.out.println("2、线程休眠20秒");
    Thread.sleep(20000);//这里休眠20秒
    System.out.println("3、线程正常休眠完毕");
    } catch (InterruptedException e) {
    System.out.println("4、线程发生异常休眠被中断");
    return;//返回方法调用处
    }
    System.out.println("5、线程正常结束run()方法体");
    }
    }
    public class InterruptDemo {

    public static void main(String[] args) {
    MyThread mt = new MyThread();
    Thread t = new Thread(mt,"线程A");
    t.start();//启动线程
    //========================================================
    try {
    Thread.sleep(2000); //保证线程至少执行2秒
    } catch (InterruptedException e) {
    e.printStackTrace();
    }
    //========================================================
    t.interrupt();//中断线程
    }
    }

    ㈨ java线程有哪些状态

    新生、就绪、运行、阻塞和死亡
    java中,每个线程都需经历新生、就绪、运行、阻塞和死亡五种状态,线程从新生到死亡的状态变化称为生命周期。

    ㈩ java中所有的生命周期有哪些

    新建-就绪-(阻塞)-运行--死亡

    其中当用new 创建完一个线程对象后,该线程处于新建状态

    当线程对象调用了start()后,该线程处于就绪状态

    如果处于就绪状态的线程获得CPU时间片,开始执行run方法的线程执行体,该线程处于运行状态

    如果线程调用了sleep()或者调用了一个阻塞式IO方法等,该线程处于阻塞状态

    如果线程的run()执行完成或者抛出一个未捕获的异常等原因,该线程处于死亡状态

    阅读全文

    与java线程生命周期相关的资料

    热点内容
    什么是数据库服务器地址 浏览:423
    atomicinteger源码 浏览:632
    程序员打架活动视频 浏览:224
    视频网站加密原理 浏览:206
    python图像区域识别 浏览:263
    javaweb项目html源码 浏览:463
    cad三点画圆命令 浏览:241
    安卓手机中英文怎么设置 浏览:880
    安卓怎么做试卷 浏览:886
    xp系统怎么做域服务器 浏览:304
    九游游戏app叫什么 浏览:624
    无压缩机除湿机 浏览:335
    柱为什么加密区 浏览:621
    结晶机pdf 浏览:111
    bim中删除命令快捷方式 浏览:981
    php生成一个文件 浏览:420
    c运行php 浏览:71
    为什么我的世界搜索不到服务器 浏览:99
    帮忙拍牌照是什么APP 浏览:934
    php网站技术架构图学习 浏览:149