Java线程之进阶篇

    xiaoxiao2021-11-20  63

    一、线程的调度

    在Java中,线程通常是抢先式的,而不是按需分配时间片式的。在抢先式中,有多个线程是“可运行的”,但只有一个线程是实际运行的。这个线程会一直运行,直到它暂停并成为“可运行态”,或者有更高优先级的线程变为“可运行的”。一个正在运行的线程暂停并成为“可运行态”的这个过程称为“被阻塞”。被阻塞有许多不同原因。例如执行Thread.sleep()。可使用静态方法Thread.currentThread()来获取对当前线程的引用 public class Xyz implements Runnable { public void run() { while (true) { // lots of interesting stuff // Print name of the current thread System.out.println("Thread" + Thread.currentThread().getName()+ "completed"); } } }

    线程的生命周期

    一个Thread对象在它的生命周期中会处于各种不同的状态

    所有“可运行的”线程根据不同的优先级,放在不同的线程池里。

    二、线程的基本控制

    1.终止线程

    当一个线程结束运行并终止时,它就不能再运行了。 可以用一个指示run()方法的退出标志来停止一个线程。

    2.测试线程

    使用isAlive()方法用来确定一个线程是否仍是活的 “活着的线程”表示该线程已经开始,而且还没有死亡 活着的线程并不意味着线程正在运行; 对于一个已开始运行但还没有完成任务的线程,这个方法返回true。

    3.访问线程的优先权

    线程在创建时,继承了父类的优先级。线程创建后,可以在任何时刻调用setPriority方法改变线程的优先级。优先级为1~10,Thread定义了其中3个常数: (1) MAX-PRIORITY最大优先级(值为10); (2) MIN-PRIORITY最小优先级(值为1); (3) NORM-PRIORITY默认优先级(值为5)。 使用setPriority()方法设置线程当前的优先权

    4.延迟线程

    Thread.sleep()方法是使线程停止一段时间的方法。 在sleep时间间隔期满后,线程不一定立即恢复执行。这是因为在那个时刻,其它线程可能正在运行而且没有被调度为放弃执行,除非 (a)“醒来”的线程具有更高的优先级 (b)正在运行的线程因为其它原因而阻塞

    join()和yield()区别

          join()方法使当前线程停下来等待,直至另一个调用join方法的线程终止。可以带有一个以毫秒为单位的时间值来调用join方法,例如:void join (long timeout);其中join()方法会挂起当前线程。挂起的时间或者为timeout毫秒,或者挂起当前线程直至它所调用的线程终止。

          使用Thread.yield()方法能给其它可运行线程一个执行的机会。如果有其它可运行线程存在,则调用Thread.yield()的线程被放入可运行池中,并允许其它线程执行。如果没有其它可运行线程,则yield()方法什么都不做。

          注意:调用sleep()方法是给更低的优先权的线程执行的机会;而调用yield()是给其它可运行线程执行的机会。两者是不同的。

    转载请注明原文地址: https://ju.6miu.com/read-678378.html

    最新回复(0)