- start
- 启动一个新线程,在新的线程运行 run 方法中的代码,此时是NEW状态
- start 方法只是让线程进入就绪,里面代码不一定立刻运行(CPU 的时间片还没分给它)。每个线程对象的start方法只能调用一次,如果调用了多次会出现IllegalThreadStateException
- run
- 新线程启动后会调用的方法,此时是RUNNABLE状态
- 如果在构造 Thread 对象时传递了 Runnable 参数,则线程启动后会调用 Runnable 中的 run 方法,否则默
认不执行任何操作。但可以创建 Thread 的子类对象,来覆盖默认行为
直接调用 run 是在主线程中执行了 run,没有启动新的线程使用 start 是启动新的线程,通过新的线程间接执行 run 中的代码
- sleep与yield
-
public static native void sleep(long millis) throws InterruptedException;
- 调用 sleep 会让当前线程从 Running 进入 Timed Waiting 状态(阻塞),且sleep期间不会释放锁
- 其它线程可以使用 interrupt 方法打断正在睡眠的线程,这时 sleep 方法会抛出 InterruptedException
- 睡眠结束后的线程未必会立刻得到执行,等待时间片的分配
- 建议用 TimeUnit 的 sleep 代替 Thread 的 sleep 来获得更好的可读性 (
TimeUnit.SECONDS.sleep(1);
) - sleep适用于无锁同步的场景
-
public static native void yield();
- 调用 yield 会让当前线程从 Running 进入 Runnable 就绪状态,然后调度执行其它线程
- 具体的实现依赖于操作系统的任务调度器
-
- join
-
public final void join() throws InterruptedException
- 等待线程调用结束
- 线程对象调用join,则等待该线程对象调用结束,处于阻塞状态
-
public final synchronized void join(long millis) throws InterruptedException
- 限时等待(到了时间就不再阻塞,向下运行)
-
- interupt
- 可打断sleep,wait,join 的线程,对这个三个状态打断后会有清空打断标记,设置为false(其实以exception来标识打断)。正常情况下的打断会设置为true。
网友评论