当前位置:首页 » 编程语言 » java线程状态转换

java线程状态转换

发布时间: 2022-07-16 18:43:18

㈠ 简速java语言中线程对象都有哪些状态,这些状态如何变化

线程的状态转换是线程控制的基础。线程状态总的可分为五大状态:分别是生、死、可运行、运行、等待/阻塞。用一个图来描述如下:

1、新状态:线程对象已经创建,还没有在其上调用start()方法。

2、可运行状态:当线程有资格运行,但调度程序还没有把它选定为运行线程时线程所处的状态。当start()方法调用时,线程首先进入可运行状态。在线程运行之后或者从阻塞、等待或睡眠状态回来后,也返回到可运行状态。

3、运行状态:线程调度程序从可运行池中选择一个线程作为当前线程时线程所处的状态。这也是线程进入运行状态的唯一一种方式。

4、等待/阻塞/睡眠状态:这是线程有资格运行时它所处的状态。实际上这个三状态组合为一种,其共同点是:线程仍旧是活的,但是当前没有条件运行。换句话说,它是可运行的,但是如果某件事件出现,他可能返回到可运行状态。

5、死亡态:当线程的run()方法完成时就认为它死去。这个线程对象也许是活的,但是,它已经不是一个单独执行的线程。线程一旦死亡,就不能复生。 如果在一个死去的线程上调用start()方法,会抛出java.lang.IllegalThreadStateException异常。

有关详细状态转换图可以参看本人的“Java多线程编程总结”中的图

二、阻止线程执行

对于线程的阻止,考虑一下三个方面,不考虑IO阻塞的情况:

睡眠;

等待;

因为需要一个对象的锁定而被阻塞。

1、睡眠

Thread.sleep(long millis)和Thread.sleep(long millis, int nanos)静态方法强制当前正在执行的线程休眠(暂停执行),以“减慢线程”。当线程睡眠时,它入睡在某个地方,在苏醒之前不会返回到可运行状态。当睡眠时间到期,则返回到可运行状态。

线程睡眠的原因:线程执行太快,或者需要强制进入下一轮,因为Java规范不保证合理的轮换。

睡眠的实现:调用静态方法。

try {
Thread.sleep(123);
} catch (InterruptedException e) {
e.printStackTrace();
}

睡眠的位置:为了让其他线程有机会执行,可以将Thread.sleep()的调用放线程run()之内。这样才能保证该线程执行过程中会睡眠。

例如,在前面的例子中,将一个耗时的操作改为睡眠,以减慢线程的执行。可以这么写:

public void run() {
for(int i = 0;i<5;i++){

// 很耗时的操作,用来减慢线程的执行
// for(long k= 0; k <100000000;k++);
try {
Thread.sleep(3);
} catch (InterruptedException e) {
e.printStackTrace(); .
}
System.out.println(this.getName()+" :"+i);
}
}

㈡ java线程中的几种状态以及相互转换

  • NEW:线程创建之后,但是还没有启动(notyetstarted)。

  • RUNNABLE:正在Java虚拟机下跑任务的线程的状态。在RUNNABLE状态下的线程可能会处于等待状态,因为它正在等待一些系统资源的释放,比如IO

  • BLOCKED:阻塞状态,等待锁的释放,比如线程A进入了一个synchronized方法,线程B也想进入这个方法,但是这个方法的锁已经被线程A获取了,这个时候线程B就处于BLOCKED状态

  • WAITING:等待状态,处于等待状态的线程是由于执行了3个方法中的任意方法。1.Object的wait方法,并且没有使用timeout参数;2.Thread的join方法,没有使用timeout参数3.LockSupport的park方法。处于waiting状态的线程会等待另外一个线程处理特殊的行为。再举个例子,如果一个线程调用了一个对象的wait方法,那么这个线程就会处于waiting状态直到另外一个线程调用这个对象的notify或者notifyAll方法后才会解除这个状态

  • TIMED_WAITING:有等待时间的等待状态,比如调用了以下几个方法中的任意方法,并且指定了等待时间,线程就会处于这个状态。1.Thread.sleep方法2.Object的wait方法,带有时间3.Thread.join方法,带有时间4.LockSupport的parkNanos方法,带有时间5.LockSupport的parkUntil方法,带有时间

  • TERMINATED:线程中止的状态,这个线程已经完整地执行了它的任务

㈢ java多线程有哪些状态,主要流转流程

有三种:
(1)继承Thread类,重写run函数
创建:
class
xx
extends
Thread{
public
void
run(){
Thread.sleep(1000)
//线程休眠1000毫秒,sleep使线程进入Block状态,并释放资源
}}
开启线程:
对象.start()
//启动线程,run函数运行
(2)实现Runnable接口,重写run函数
开启线程:
Thread
t
=
new
Thread(对象)
//创建线程对象
t.start()
(3)实现Callable接口,重写call函数
Callable是类似于Runnable的接口,实现Callable接口的类和实现Runnable的类都是可被其它线程执行的任务。
Callable和Runnable有几点不同:
①Callable规定的方法是call(),而Runnable规定的方法是run().
②Callable的任务执行后可返回值,而Runnable的任务是不能返回值的
③call()方法可抛出异常,而run()方法是不能抛出异常的。
④运行Callable任务可拿到一个Future对象,Future表示异步计算的结果。它提供了检查计算是否完成的方法,以等
待计算的完成,并检索计算的结果.通过Future对象可了解任务执行情况,可取消任务的执行,还可获取任务执行的结果

㈣ Java中线程的几种可用状态有哪些请大家解释一下。

线程在执行过程中,可以处于下面几种状态:
1、就绪(Runnable):线程准备运行,不一定立马就能开始执行。
2、运行中(Running):进程正在执行线程的代码。
3、等待中(Waiting):线程处于阻塞的状态,等待外部的处理结束。
4、睡眠中(Sleeping):线程被强制睡眠。
5、I/O阻塞(BlockedonI/O):等待I/O操作完成。
6、同步阻塞(BlockedonSynchronization):等待获取锁。
7、死亡(Dead):线程完成了执行。

㈤ java 总结几种线程异步转同步的方法

以Java语言为例:
用synchronized关键字修饰同步方法。
同步有几种实现方法分别是synchronized,wait与notify
wait():使一个线程处于等待状态,并且释放所持有的对象的lock。
sleep():使一个正在运行的线程处于睡眠状态,是一个静态方法,调用此方法要捕捉InterruptedException异常。
notify():唤醒一个处于等待状态的线程,注意的是在调用此方法的时候,并不能确切的唤醒某一个等待状态的线程,而是由JVM确定唤醒哪个线程,而且不是按优先级。
Allnotity():唤醒所有处入等待状态的线程,注意并不是给所有唤醒线程一个对象的锁,而是让它们竞争。
同步是多线程中的重要概念。同步的使用可以保证在多线程运行的环境中,程序不会产生设计之外的错误结果。同步的实现方式有两种,同步方法和同步块,这两种方式都要用到synchronized关键字。
给一个方法增加synchronized修饰符之后就可以使它成为同步方法,这个方法可以是静态方法和非静态方法,但是不能是抽象类的抽象方法,也不能是接口中的接口方法。下面代码是一个同步方法的示例:
public synchronized void aMethod() {
// do something
}
public static synchronized void anotherMethod() {
// do something
}

线程在执行同步方法时是具有排它性的。当任意一个线程进入到一个对象的任意一个同步方法时,这个对象的所有同步方法都被锁定了,在此期间,其他任何线程都不能访问这个对象的任意一个同步方法,直到这个线程执行完它所调用的同步方法并从中退出,从而导致它释放了该对象的同步锁之后。在一个对象被某个线程锁定之后,其他线程是可以访问这个对象的所有异步方法的。
同步块是通过锁定一个指定的对象,来对同步块中包含的代码进行同步;而同步方法是对这个方法块里的代码进行同步,而这种情况下锁定的对象就是同步方法所属的主体对象自身。如果这个方法是静态同步方法呢?那么线程锁定的就不是这个类的对象了,也不是这个类自身,而是这个类对应的java.lang.Class类型的对象。同步方法和同步块之间的相互制约只限于同一个对象之间,所以静态同步方法只受它所属类的其它静态同步方法的制约,而跟这个类的实例(对象)没有关系。

㈥ JAVA语言中请写出线程从阻塞状态恢复到就绪状态的三种途径

线程从阻塞状态恢复到就绪状态,有三种途径:自动恢复、用resume()方法恢复,notify方法恢复。

当编辑并运行一个Java程序时,需要同时涉及到这四种方面。使用文字编辑软件或集成开发环境在Java源文件中定义不同的类 ,通过调用类中的方法来访问资源系统。

把源文件编译生成一种二进制中间码,存储在class文件中,然后再通过运行与操作系统平台环境相对应的Java虚拟机来运行class文件,执行编译产生的字节码,调用class文件中实现的方法来满足程序的Java API调用。



(6)java线程状态转换扩展阅读:

整数型用来存储整数数值,即没有小数部分的数值。可以是正数,也可以是负数。整数数据在Java程序中有3种表示形式,分别为十进制、八进制和十六进制。

自增和自减是单目运算符,可以放在操作元之前,也可以放在操作元之后。操作元必须是一个整型或浮点型变量。自增、自减运算符的作用是使变量的值增1或减1。

放在操作元前面的自增、自减运算符,会先将变量的值加1或减1,然后再使该变量参与表达式的运算。放在操作元后面的自增、自减运算符,会先使变量参与表达式的运算,然后再将该变量的值加1或减1。

㈦ java线程的几种转态

public enum State {
/**
* Thread state for a thread which has not yet started.
*/
NEW,

/**
* Thread state for a runnable thread. A thread in the runnable
* state is executing in the Java virtual machine but it may
* be waiting for other resources from the operating system
* such as processor.
*/
RUNNABLE,

/**
* Thread state for a thread blocked waiting for a monitor lock.
* A thread in the blocked state is waiting for a monitor lock
* to enter a synchronized block/method or
* reenter a synchronized block/method after calling
* {@link Object#wait() Object.wait}.
*/
BLOCKED,

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

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



㈨ JAVA中线程有哪五个基本状态它们之间如何让转化

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

㈩ Java线程的几种状态

线程是一个动态执行的过程,它有一个从产生到死亡的过程,共五种状态:

1、新建(new Thread)

当创建Thread类的一个实例(对象)时,此线程进入新建状态(未被启动)

例如:Thread t1=new Thread();

2、就绪(runnable)

线程已经被启动,正在等待被分配给CPU时间片,也就是说此时线程正在就绪队列中排队等候得到CPU资源。例如:t1.start();

3、运行(running)

线程获得CPU资源正在执行任务(run()方法),此时除非此线程自动放弃CPU资源或者有优先级更高的线程进入,线程将一直运行到结束。

4、堵塞(blocked)

由于某种原因导致正在运行的线程让出CPU并暂停自己的执行,即进入堵塞状态。

  • 正在睡眠:用sleep(long t) 方法可使线程进入睡眠方式。一个睡眠着的线程在指定的时间过去可进入就绪状态。

  • 正在等待:调用wait()方法。(调用notify()方法回到就绪状态)

  • 被另一个线程所阻塞:调用suspend()方法。(调用resume()方法恢复)

5、死亡(dead)

当线程执行完毕或被其它线程杀死,线程就进入死亡状态,这时线程不可能再进入就绪状态等待执行。

  • 自然终止:正常运行run()方法后终止

  • 异常终止:调用stop()方法让一个线程终止运行

热点内容
bs源码 发布:2025-02-01 16:51:52 浏览:568
百度云zip怎么解压 发布:2025-02-01 16:31:59 浏览:567
pmc密码是什么意思 发布:2025-02-01 16:28:49 浏览:784
苹果手表和安卓手表哪个好用 发布:2025-02-01 16:28:07 浏览:583
上海电信上传 发布:2025-02-01 16:22:10 浏览:983
有什么好的双u主板配置 发布:2025-02-01 16:18:17 浏览:177
编程漩涡 发布:2025-02-01 16:01:51 浏览:328
司机会所访问 发布:2025-02-01 15:54:11 浏览:781
家用电脑改成服务器并让外网访问 发布:2025-02-01 15:30:23 浏览:355
javac工资 发布:2025-02-01 15:24:28 浏览:23