1,如何创建线程
public static void main(String[] args) {
Thread thread1 = new Thread(){
@Override
public void run(){
System.out.println("thread1 is run");
}
};
thread1.start();
Thread thread2 = new Thread(new Runnable() {
@Override
public void run() {
System.out.println("thread2 is run");
}
});
thread2.start();
}
第一种是new Thread()覆盖runnable接口run方法,实现runnable接口的类,也可以达到复写run方法的目的。
tips(直接调用run方法不会开启一个线程,和普通的方法调用没有区别,只有采用start方法调用才参与系统的调度)
2,线程的六种状态
参看Thread类的内部枚举类State
NEW(new Thread())
RUNNABLE(java虚拟机中的状态,执行状态即调用start方法之后的状态,但是此时线程并不一定运行,只是代表已经准备完毕等待操作系统调度,但什么时候调度不是确定的。)
BLOCKED(有两层语义)
一个处于 blocked 状态的线程正在等待一个监视器锁以进入一个同步的块或方法
public static void main(String[] args) throws InterruptedException {
class Counter {
int counter;
public synchronized void increase() {
counter++;
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
}
Counter c = new Counter();
Thread test1 = new Thread(new Runnable() {
public void run() {
c.increase();
}
}, "Test1");
test1.start();
Thread test2 = new Thread(new Runnable() {
public void run() {
c.increase();
}
}, "Test2");
test2.start();
Thread.sleep(100);
System.out.println(test2.getState().equals(Thread.State.BLOCKED));
}
可以通过VisualVM查看test2的状态如下所示
图上的“监视(monitor)”状态即为 BLOCKED 状态
一个处于 blocked 状态的线程正在等待一个监视器锁,在其调用 Object.wait 方法之后,以再次进入一个同步的块或方法)
WAITING(一个线程等待另一个线程)
TIMED_WAITING(和waiting不同的是指有等待时间的等待线程)
Thread.sleep(long),Thread.join(long),LockSupport.parkNanos(long),LockSupport.parkUntil(long)
TERMINATED(线程已完成执行)