java线程的几种状态

Python015

java线程的几种状态,第1张

总结了6种状态,希望对你所有帮助:

1、NEW 状态是指线程刚创建, 尚未启动

2、RUNNABLE 状态是线程正在正常运行中, 当然可能会有某种耗时计算/IO等待的操作/CPU时间片切换等, 这个状态下发生的等待一般是其他系统资源, 而不是锁, Sleep等

3、BLOCKED  这个状态下, 是在多个线程有同步操作的场景, 比如正在等待另一个线程的synchronized 块的执行释放, 或者可重入的 synchronized块里别人调用wait() 方法, 也就是这里是线程在等待进入临界区

4、WAITING  这个状态下是指线程拥有了某个锁之后, 调用了他的wait方法, 等待其他线程/锁拥有者调用 notify / notifyAll 一遍该线程可以继续下一步操作, 这里要区分 BLOCKED 和 WATING 的区别, 一个是在临界点外面等待进入, 一个是在临界点里面wait等待别人notify, 线程调用了join方法 join了另外的线程的时候, 也会进入WAITING状态, 等待被他join的线程执行结束

5、TIMED_WAITING  这个状态就是有限的(时间限制)的WAITING, 一般出现在调用wait(long), join(long)等情况下, 另外一个线程sleep后, 也会进入TIMED_WAITING状态

6、TERMINATED 这个状态下表示 该线程的run方法已经执行完毕了, 基本上就等于死亡了(当时如果线程被持久持有, 可能不会被回收)

自己写的代码。能通过测试

题目中的要求用线程实现图片的切换

主要有两种方式可以实现。一种是Swing包下的Timer类。一种是Thread类

import java.awt.*

import java.awt.event.*

import javax.swing.*

public class MousDemo extends JFrame {

MyJPanel mp

int index

ImageIcon[] imgs = { new ImageIcon("C:\\Users\\lenovo\\Desktop\\a.png"),

new ImageIcon("C:\\Users\\lenovo\\Desktop\\b.png") }

public MousDemo() {

mp = new MyJPanel(false)

this.add(mp)

this.setSize(300, 200)

this.setDefaultCloseOperation(EXIT_ON_CLOSE)

this.setTitle("鼠标窗口")

this.setVisible(true)

/**

 * 方式一,使用TImer来切换图片

 * Swing下的Timer组件,个人觉得非常适合

 * Timer(200,new ActionListener())意思就是每200毫秒执行一次ActionListener里面的方法

 * */

Timer timer = new Timer(200,new ActionListener() {

@Override

public void actionPerformed(ActionEvent e) {

mp.flag = !mp.flag

mp.repaint()

}

})

timer.start()

/**

 * 方法二:

 * 线程的方式

 * */

// new Thread(new Runnable() {

//

// @Override

// public void run() {

// while(true){

// mp.flag = !mp.flag

// mp.repaint()

// try {

// Thread.sleep(200)

// } catch (InterruptedException e) {

// e.printStackTrace()

// }

// }

//

// }

// }).start()

}

public static void main(String[] args) {

new MousDemo()

}

class MyJPanel extends JPanel{

boolean flag

public MyJPanel(boolean flag) {

this.flag = flag

}

@Override

public void paint(Graphics g) {

super.paint(g)

if(flag == false){

g.drawImage(imgs[0].getImage(), 0, 0,this)

}else{

g.drawImage(imgs[1].getImage(), 0, 0,this)

}

}

}

}

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

用new运算符和Thread类或其子类建立一个线程对象后,该线程就处于新生状态。

线程的生命周期,把图转化为文字就是: 

1、线程通过new方法创建,调用start,线程进入就绪状态,等待系统的调度(时间片轮转调度)。当系统调度,进入运行状态。正常结束或者异常退出,进程进入死亡状态。

2、处于运行状态的线程若遇到sleep,则线程进入睡眠状态,不会让出资源锁,sleep结束,线程转为就绪状态,等待系统重新调度。

3、处于运行状态的线程可能在等待io,也可能进入挂起状态。io完成,转为就绪状态。

4、处于运行状态的线程yield,线程转为就绪状态。(yield只让给权限比自己高的)

5、处于运行状态的线程遇到wait,线程处于等待状态,需要notify()/notifyALL来唤醒线程,唤醒后的线程处于锁定状态,获取了“同步锁”,之后,线程才转为就绪状态。处于运行的线程synchronized,加上后 变成同步操作。处于锁定状态,获取了“同步锁”,之后,线程才转为就绪状态。