首页 > 技术文章 > 多线程基础知识(二) 线程的Thread类

liulaolaiu 2019-01-23 14:34 原文

线程的Thread类

Thread类包含为任务而创建的线程的构建方法,以及控制线程的方法。

首先,我们可以看一下Thread类的UML图:
在这里插入图片描述
Thread类还包含方法stop()、suspend()和resume()。由于普遍认为这些方法具有内在的不安全因素,所以,在Java中现在并不体长使用这些方法,为替代方法stop()的使用,可以通过给Thread的变量复制null来表明它已经停止。

可以使用yield()方法 其他线程临时让出CPU时间,例如,将前一节中的

方法sleep(long mills)可以将该线程设置为休眠以请确保其他线程的执行,休眠时间为制定的毫秒数。例如,程序如下:

public void run() {
    try {
        for (int i = 1; i <= lastNum; i ++) {
            System.out.print(" " + i);
            if (i >= 40) Thread.sleep(1);
        }
    }
    catch (InterruptedException ex) {
    }
}

在这一段程序中,当i大于等于50之后,每打印一个数字,print100任务的线程就会休眠1毫秒。

在这里有一点需要注意的是,sleep()方法的声明中有着一个InterruptedException的可能抛出的异常,这是一个必检异常,因为Java牵制捕捉必检的异常,所以,其所在的代码块是必须放入try-catch块中的。当一个休眠线程的interrupt()方法被调用时,就会发生这样一个异常。但是,这个interrupt()方法极少在线程被调用。

还有一点需要注意的是,如果在一个循环中调用了sleep方法,想让在循环中若发生何种状况则等待一定时间,那就应该将这个循环放在try-catch块中,如下程序:

public void run() {
    try {
        while (...) {            // <---循环开始
            ...
            Thread.sleep(1000);  // <---这里的sleep()方法在循环内
        }
    }
    catch (InterruptedException ex) {
    }
}

如果将循环放在了try-catch块之外,如下:

public void run() {
    while(...) {                // <---循环开始,但是在try-catch块之外
        try {
            ...
            Thread.sleep(1000); // <---将sleep所在的try-catch块放在了while之内
        }
        catch (InterruptedException ex) {
        }
    }
}

这样会导致即使线程被中断,程序可能也不会等待,而是会继续执行下一次的循环内的代码。

Java给每个线程指定一个优先级。默认情况下,线程继承生成它的线程的优先级,此外,我们可以用setPriority(int p)来提高或降低线程的优先级,还能使用getPriority()方法来获取线程的优先级。优先级是从1到10的胡子,Thread类有int型常量MIN_PRIORITY、NORM_PRIOTITY、MAX_PRIORITY,分别代表1、5和10。主线程的优先级是Thread.NORM_PRIOTITY.

Java虚拟机总是选择当前优先级最高的可运行线程。较低优先级的线程只有在没有比它更高的优先级的线程运行时才能运行。如果所有可运行的线程具有相同的优先级,那将会用循环队列给它们分配相同的CPU份额,这被称为循环调度(round-robin scheduling)。

推荐阅读