在Java的多线程中,thread类是一个重要的工具,我们要更理解thread类的用法,再能帮助我们深入了解Java并发。
public class ThreadDemo {
public static void main(String[] args) {
// 创建10个线程并启动
for (int i = 0; i < 10; i++) {
MyThread thread = new MyThread(i);
thread.start();
}
}
}
class MyThread extends Thread {
private int id;
public MyThread(int id) {
this.id = id;
}
public void run() {
System.out.println("Thread " + id + " is running");
try {
Thread.sleep(1000); // 模拟任务执行时间
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
上面的代码中,start,run,sleep都是thread类重要方法。
首先,start方法:
在一个线程中,start方法只能调用一次,如出现多次调用,会出现调用两次的话,会抛出 IllegalThreadStateException 这个异常。
这是因为线程分为六个状态:
状态 描述
新建(NEW) 表示线程已经创建好了,但是还没有调用start()方法
就绪(RUNNABLE) 表示线程可能在运行,也可能在就绪队列
阻塞 (BLOCKED) 表示线程处于等在锁的状态
等待(WAITING) 表示线程处于条件等待状态,当触发条件后会唤醒
计时等待(TIME_WAIT) 比WAITING多了个超时条件触发的机制
终止(TERMINATED) 表示线程执行结束
原文链接:https://blog.csdn.net/m0_63463510/article/details/129018114
除了new这个状态,在其他状态使用start方法时,可能会导致线程紊乱等,影响程序效率。
其次,run方法:
JVM启动时会有一个由主方法所定义的线程,同时可以通过创建Thread的实例来创建新的线程。每个线程都是通过某个特定Thread对象所对应的方法run()来完成其操作的,方法run()称为线程体。通过调用Thread类的start()方法来启动一个线程。
run方法不能实现并发,只是在并发的时候会被调用。
最后,sleep方法:
sleep方法可以让线程休眠,但与wait方法不同的是,sleep方法不会释放对象锁,释放cpu资源。