本文共 1929 字,大约阅读时间需要 6 分钟。
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方法调用才参与系统的调度)
参看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(线程已完成执行)
转载地址:http://vhazb.baihongyu.com/