总结了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,加上后 变成同步操作。处于锁定状态,获取了“同步锁”,之后,线程才转为就绪状态。