线程执行方式:
- 顺序执行 run()
- 并行执行 start()
启动线程的方式:
- 继承 Thread 重写 run 方法
new MyThread().start(); - 实现 Runnable 接口 重写 run 方法
new Thread(new MyRun()).start(); - Lambda 表达式
new Thread(() -> {
…
}).start(); - 线程池开启线程:
Executors.newFixedThreadPool(5);
线程方法: - 让出线程: t.yield(time)
线程暂停的方式
睡眠状态方法: (时间结束)
- 线程睡眠: Thread.sleep(time)
- 等待队列: o.wait(time)
- 去别的线程执行: t.join(time)
- LockSupport.parkNanos()
- LockSupport.parkUntil()
等候状态方法: (通知结束) 通知方式
- 等待队列: o.wait() / o.notify()
- 去别的线程执行: t.join() / o.notifyAll()
- LockSupport.park() / LockSupport.unpark()
阻塞状态方法:
- 等待进入同步代码块的锁
sleep 与 wait 的区别:
sleep() 是 Thread 类的静态本地方法;
sleep() 方法可以在任何地方使用;
sleep() 会休眠当前线程指定时间,释放 CPU 资源,不释放对象锁,休眠时间到自动苏醒继续执行;
wait() 是Object类的成员本地方法
wait() 方法则只能在同步方法或同步代码块中使用,否则抛出异常Exception in thread "Thread-0" java.lang.IllegalMonitorStateException
wait() 方法放弃持有的对象锁,进入等待队列,当该对象被调用 notify() / notifyAll() 方法后才有机会竞争获取对象锁,进入运行状态