本文主要是介绍多线程学习(三)——控制线程,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
Java里提供了一些工具方法,通过这些方法可以很好地控制线程的执行。
1、join线程
Thread提供了让一个线程等待另一个线程完成的方法——join()方法。当在某个程序执行流中调用其他线程的join()方法时,调用线程将被阻塞,直到被join()方法加入的join线程执行完为止。
2、后台控制线程
有一种线程,它是在后台运行的,它的任务是为其他的线程提供服务,这种线程被称为“后台线程(Daemon Thread)”,又称为“守护线程”或“精灵线程”。JVM的垃圾回收线程就是典型的后台线程。
后台线程有个特征:如果所有的前台线程都死亡了,后台线程就会自动死亡。
调用Thread对象的setDaemon(true)方法可以将指定线程设置成后台线程。需要注意的一点是:将某个线程设置为后台线程,必须在该线程启动之前设置,也就是setDaemon(true)必须在start()方法之前调用,否则就会引发程序抛出下面的异常:IllegalThreadStateException异常。
3、线程睡眠:sleep(静态方法)
如果需要让当前正在执行的线程暂停一段时间,并进入阻塞状态,则可以通过调用Thread类的静态sleep()方法来实现。
4、线程让步:yield(静态方法)
yield()方法是一个和sleep()方法有点相似的方法,它也是Thread类提供的一个静态方法,它也可以让当前正在执行的线程暂停一下,让系统的线程调度器重新调度一次,完全会出现下面的情况:某个线程调用了yield()方法暂停之后,线程调度器又将其调度出来重新执行。
实际上,当一个线程调用了yield()方法暂停之后,只有优先级与当前线程相同,或者优先级比当前线程更高的处于就绪状态的线程才会获得执行的机会。
5、改变线程优先级
每个线程都具有一定的优先级,优先级高的线程获得较多的执行机会,而优先级低的线程则获得较少的执行机会。
每个线程默认的优先级都与创建它的父线程的优先级相同,再默认情况下,main线程具有普通优先级,由main线程创建的子线程也具有普通优先级。
Thread类提供了setPriority(int newPriority)、getPriority()方法来设置和返回指定线程的优先级,其中setPriority()方法的参数可以是一个整数,范围是1--10之间,也可以使用Thread类的如下三个静态常量:
MAX_PRIORITY:其值是10
MIN_PRIORITY:其值是1
NORM_PRIORITY:其值是5
注意:虽然java提供了10个优先级别,但是不同的操作系统上的优先级并不相同,所以尽量避免直接为线程指定优先级,应该尽量多的使用上面的三个静态变量,这样才可以保证程序具有最好的可移植性。
(参考《疯狂Java讲义第3版》)
这篇关于多线程学习(三)——控制线程的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!