1.java线程-Thread/Runnable
java原生支持中,实现一个线程,有两种形式:继续Thread类、实现Runnable接口。
public class ThreadTest extends Thread {
@Override
public void run() {
System.out.println(Thread.currentThread().getName() + " hello!");
}
public static void main(String[] args){
System.out.println(Thread.currentThread().getName());
new ThreadTest().start();
new ThreadTest().start();
new ThreadTest().start();
}
}
public class RunnableTest implements Runnable {
@Override
public void run() {
System.out.println(Thread.currentThread().getName() + " hello");
}
public static void main(String[] args) {
System.out.println(Thread.currentThread().getName());
RunnableTest run = new RunnableTest();
new Thread(run).start();
new Thread(run).start();
new Thread(run).start();
}
}
可以看到,最终调用的还是Thread.start()方法。
2.线程状态
java线程状态位于java.lang.Thread.State中,这是一个枚举类,类的内容如下:
/**
* 位于java.lang.Thread内部
*/
public enum State {
/**
* 新建(NEW),表示线程被创建出来还没真正启动的状态,可以认为它是个 Java 内部状态。
*/
NEW,
/**
* 就绪(RUNNABLE),表示该线程已经在 JVM 中执行,当然由于执行需要计算资源,
* 它可能是正在运行,也可能还在等待系统分配给它 CPU 片段,在就绪队列里面排队。
*/
RUNNABLE,
/**
* 阻塞(BLOCKED),这个状态和我们前面两讲介绍的同步非常相关,阻塞表示线程在等待 Monitor lock。
* 比如,线程试图通过 synchronized 去获取某个锁,但是其他线程已经独占了,那么当前线程就会处于阻塞状态。
*/
BLOCKED,
/**
* 等待(WAITING),表示正在等待其他线程采取某些操作。
* 一个常见的场景是类似生产者消费者模式,发现任务条件尚未满足,就让当前消费者线程等待(wait),另外的生产者线程去准备任务数据,然后通过类似 notify 等动作,通知消费线程可以继续工作了。
* Thread.join() 也会令线程进入等待状态。
*/
WAITING,
/**
* 计时等待(TIMED_WAIT),其进入条件和等待状态类似,但是调用的是存在超时条件的方法,比如 wait 或 join 等方法的指定超时版本,如下面示例:
* Thread.sleep
* Object.wait(long)
* Thread.join(log)
*/
TIMED_WAITING,
/**
* 终止(TERMINATED),不管是意外退出还是正常执行结束,线程已经完成使命,终止运行,也有人把这个状态叫作死亡。
*/
TERMINATED;
}