Java中启动一个线程的方式只有两种:
- 继承Thread类,实例化,调用start()
- 通过Runnable new 出Thread对象,调用start()
也就是说,在Java中除了Thread类中的start方法,没有第二种方案可以启动一个线程。
synchronized
内置锁,线程进入该对象的等待队列
- 对象锁
- 类锁,使用该类的class对象加锁。如,给类静态方法上锁。
volatile
只保证可见性,不保证原子性。适用于一个线程写,多个线程读。
Object::wait()
等待该对象,进入该对象的等待队列。必须持有锁,才能调用该方法。释放锁,wait返回时,重新持有锁。
Object::notify()
通知,唤醒该对象等待队列中的一个。必须持有锁,才能调用该方法。不释放锁。
Object::notifyAll()
通知,唤醒该对象等待队列中的所有线程。必须持有锁,才能调用该方法。不释放锁。
Thread::yield()
让出CPU执行权,重新参与竞争。不释放锁。
Thread::sleep()
休眠一段时间。不释放锁。
Thread::join()
插队,线程A执行了线程B的join方法,那么,线程A会等待线程B执行完后再继续执行。
Thread::start()
启动线程
Thread::stop() Thread::resume() Thread::suspend()
弃用的方法,使用会导致意想不到的bug。
stop()直接终止线程;suspend()暂停线程的执行;resume()恢复线程的执行。
抢占式,不释放资源,因此被弃用,Java现在的线程机制是协作式,使用中断的机制。
Thread::interrupt()
通知该线程应该中断了,将中断标志位置为true。至于怎样处理,是否理会这种中断,完全由线程内部的逻辑决定。
Thread::isInterrupted()
检查该线程是否处于中断状态,即中断标志位是否被标记为true。
Thread::static interrupted()
判断当前线程是否处于中断状态,同时中断标志位改为false。
InterruptedException
中断异常,同时线程的中断标志位将被改为false,如果确实应该中断该线程,需要在catch块中手动调用Thread::interrupt()方法。jdk中阻塞方法一般都默认抛出InterruptedException。
Thread::setDaemon()
将该线程设置为当前线程的守护线程。和主线程共死,finally不能保证一定执行。