Java 线程中的几个重要方法
start()与run()
实现线程类时无论是继承Thread类还是实现Runnable接口,都要实现run()方法实现具体的线程业务逻辑,但是真正启动线程类时要注意使用start()方法,调用run()方法并不会启动一个线程去执行,只会当成普通的类方法来执行。
所以start()方法会启动2个线程运行,而run()方法只会启动一个线程。
使该线程开始执行;Java 虚拟机调用该线程的 run 方法。
结果是两个线程并发地运行;当前线程(从调用返回给 start 方法)和另一个线程(执行其 run 方法)。
yield()
暂停当前正在执行的线程对象,并执行其他线程。
调用方法之后线程会立即释放占用的资源,CPU可以转向执行其它的线程。但是具体执行哪个线程并不确定,所以也有可能下次还是执行当前线程。
join()
等待该线程终止
线程调用此方法后会一直等待被调用的线程结束才继续执行,也可以传入时间参数设置最长等待时间。
stop()
Java的API已经明确表示stop()是已过时的方法:
已过时。 该方法具有固有的不安全性。用 Thread.stop 来终止线程将释放它已经锁定的所有监视器(作为沿堆栈向上传播的未检查 ThreadDeath 异常的一个自然后果)。如果以前受这些监视器保护的任何对象都处于一种不一致的状态,则损坏的对象将对其他线程可见,这有可能导致任意的行为。stop 的许多使用都应由只修改某些变量以指示目标线程应该停止运行的代码来取代。目标线程应定期检查该变量,并且如果该变量指示它要停止运行,则从其运行方法依次返回。
正确停止线程的方式应该是定义一个volatile类型的公共状态变量,线程循环检查来判断是否需要结束代码的执行,状态变量由外部线程设置。
interrupted()
中断线程。
这个方法并不能实际上的中断线程,只会修改isInterrupted()的返回值,如果调用了方法,该方法返回true,借此在代码中停止线程。原理类似上面说到的通过状态变量停止线程。
但是,此方法会触发sleep()、join()、wait()方法抛出InterruptedException异常,所以并不是一个好方法,建议还是自己实现线程停止方法。