方法一:将一个类声明为Thread的子类(继承), 这个子类应该重写Thread类的run方法 。 然后可以分配并启动子类的实例。
class MyThread extends Thread{
@Override
public void run() {
System.out.println("你好!");
}
}
public class Test1 {
public static void main(String[] args) {
// 创建 MyThread 对象
MyThread mt = new MyThread();
// 启动线程
mt.start();
}
}
运行结果:你好!
方法二:声明实现类 Runnable 接口(实现),那个类
class MyRunnable implements Runnable{
@Override
public void run() {
System.out.println("欢迎来到编程世界!");
}
}
public class Test2 {
public static void main(String[] args) {
// 创建 线程类对象
MyRunnable mr = new MyRunnable();
// 创建 Thread 对象
Thread t = new Thread(mr);
// 启动线程
t.start();
}
}
运行结果:欢迎来到编程世界!
问题?
异常 IllegalThreadStateException
class MyThread extends Thread{
@Override
public void run() {
System.out.println("你好!");
}
}
public class Test1 {
public static void main(String[] args) {
// 创建 MyThread 对象
MyThread mt = new MyThread();
// 启动线程
mt.start();
mt.start();
}
}
A zero status value corresponds to state “NEW” 意思是 零状态值对应于状态“NEW”
状态 | 描述 |
---|---|
新建(NEW) | 表示线程已经创建好了,但是还没有调用 start() 方法 |
就绪(RUNNABLE) | 表示线程可能在运行,也可能在就绪队列 |
阻塞(BLOCKED) | 表示线程处于等在锁的状态 |
等待(WAITING) | 表示线程处于条件等待状态,当触发条件后会唤醒 |
计时等待(TIME_WAIT) | 比 WAITING 多了个超时条件触发的机制 |
终止(TERMINATED) | 表示线程执行结束 |
线程第二次调用 start() 方法时,可能处于终止或者其他非 NEW 状态,对线程判断是否处于 NEW 状态,不是,就会抛出异常
线程执行的随机性,原因是线程"抢占式执行"的方式,谁先抢到,CPU分配资源,谁先执行的缘故。
示例代码
class MyThread extends Thread{
private int value;
public MyThread(int value){
this.value = value;
}
@Override
public void run() {
System.out.println(value);
}
}
public class Test1 {
public static void main(String[] args) {
// 创建 MyThread 对象
MyThread mt1 = new MyThread(1);
MyThread mt2 = new MyThread(2);
MyThread mt3 = new MyThread(3);
MyThread mt4 = new MyThread(4);
// 启动线程
mt1.start();
mt2.start();
mt3.start();
mt4.start();
}
}
输出结果
注意:由于随机性,所以运行多次产生的结果是可能不一致的