1.start()和run()
start()方法是是开启线程的方法,这个方法执行后,一个线程才真正的进入RUNNABLE状态。run()方法是线程中具体执行的业务活动,一般都要重写run()方法。
2.stop()
stop()方法在结束线程时,会直接终止线程,并立即释放这个线程所持有的锁,而锁恰恰是用来维护对象一致性的。例如写线程正在写到一半,线程被强行终止,对象就会被写坏了,同时锁已经释放,其他对象读到这个对象是写坏了的对象。
3.interrupt()、isInterrupted()、interrupted()
interrupt()方法是一个实例方法,它通知目标线程中断,也就是设置中断标志位。相当于给线程发送一个通知,告知要人希望你退出了。至于目标线程以后怎么处理看目标线程自己的了。isInterrupted()方法也是实例方法,他判断当前线程是否被中断。interrupted()是个静态方法,可用来判断当前线程的中断状态,同时会清除当前线程的中断标志位状态。
4.sleep()
sleep()方法是让当前线程休眠若干时间,它会抛出一个InterruptedException中断异常。这个异常不是运行时异常,必须捕获且处理,当线程在sleep()休眠时,如果被中断,这个异常就会产生。一旦被中断后,抛出异常,会清除标记位,如果不加处理,下一次循环开始时,就无法捕获这个中断,故一般在异常处理时再设置标记位。sleep()方法不会释放任何对象的锁资源。
5.wait()和notify()
wait()等待方法,是Object类中的方法,当一个对象实例上调用wait()方法后,当前线程就会在这个对象上等待。那么等待什么时候结束呢?线程一直等到其他线程调用了这个对象的notify()方法为止。这样实例对象就成了多个线程间的通信手段。wait()和notify()不能随便调用,它必须包含在对应的synchronize语句中,这俩方法,都需要首先获得目标对象的一个监听器,而wait()和notify()方法在执行后会释放这个监听器。wait()方法会释放目标对象的锁。
6.suspend()和resume()
suspend()方法挂起线程,resume()方法继续执行,被挂起的线程必须等到resume()才能继续指定。suspend()方法在导致线程暂停的同时,并不会释放任何锁资源,而其他线程要访问被它占用的锁时会被牵连导致无法正常运行,只到遇到resume()操作才能继续。被suspend挂起的线程,从 它的线程状态来看,居然还是RUNNABLE,会影响判断。因此这俩方法已经被废弃,不建议使用。
7.join()和yeild()
join()方法表示无限的等待,他会一直阻塞当前线程,只到目标线程执行完毕。join(long millis) 给出了一个最大等待时间,如果超过给定的时间目标线程还在执行,当前线程就不等了,继续往下执行。
yeild()方法是个静态方法,一旦执行,他会使当前线程让出CPU。让出CPU不代表当前线程不执行了,还会进行CPU资源的争夺。如果一个线程不重要或优先级比较低,可以调用这个方法,把资源给重要的线程去做。
8.volatile
当用事volatile声明一个变量的时候,就是告诉虚拟机,这个变量极有可能会被某些程序或者线程修改。为了确保修改后,所有线程能看到这个改动,虚拟机会采取一些手段保证这个变量的可见性。
9.守护线程和用户线程
守护线程是系统的守护者,在后台默默的完成系统性服务,比如垃圾回收线程、JIT线程等。用户线程是系统的工作线程,完成这个系统要完成的因为操作,如果所有的用户线程结束了,那么守护线程也就不存在了,整个程序也就结束了。当一个Java应用里只有守护线程时,Java虚拟机会自然退出。
设置守护线程必须在start()之前设置,Thread.setDaemon(true)。
10.synchronize
synchronize关键字的作用是实现线程间的同步。它的工作是对同步代码加锁,使得每次只能有一个线程能进入代码块,从而保证了线程间的安全性。使用方法:知道加锁对象,直接作用于实例方法,直接作用于静态方法。