多线程:《Java面向对象编程》学习笔记10——多线程中线程放弃运行态的几种思路方法

1.调节各个线程的优先级

Thread类中的setPriority(int)和getPriority()方法可以设置和获取线程的优先级。优先级用整数表示。取值范围为1-10.Thread有三个静态变量:

MAX_PRIORITY :取值为10,最高。

MIN_PRIORITY:取值为1,最低。

NORM_PRIORITY:取值为5,默认。

主线程默认的优先级为5,若A线程创建了B线程,则B和A有同样的优先级。值得注意的是,在实际的OS中,JVM的优先级没有得到很好的映射,若对程序的可移植性有高的要求的话,那么应该确保在设置线程优先级时只使用上述三个静态变量。

2.线程睡眠:

使用sleep()方法,线程会转为阻塞态。休眠结束后转为就绪态。若中途打断(用interrupt()方法),则抛出异常InterruptedException。

3.线程让步:

使用yield()方法,若此时有相同优先级(或更高)的其他线程处于就绪态,则将当前运行的线程放到可运行池中(就绪态)并使其他线程运行。若没有相同优先级的线程则什么都不做。和sleep不同的地方是,sleep方法不考虑进程的优先级,而且sleep在休眠的时候转入阻塞态,具有更好的移植性。yield实际的作用是在测试中人为的提高程序的并发性能,以帮助发现一些隐藏的错误。

4.等待其他线程结束:

一个线程可以使用另一个线程的join()方法,当前运行的线程会转到阻塞态,直到另一个线程运行结束,它才会恢复运行。join可以传入超时的时间参数,若超过这个时间则线程也会恢复运行。

package org.bupt.test;

public class Machine extends Thread{

    public void run() {
        for (int a = 0; a < 50; a++) {
            System.out.println(currentThread().getName()+":"+a);
            }
    }
    public static void main(String[] args) throws InterruptedException {
        Machine machine=new Machine();
        machine.setName("m1");
        machine.start();
        System.out.println("main:join machine");
        machine.join();
        System.out.println("main:end");
    }

}

运行结果:

main:join machine
m1:0
m1:1
m1:2
m1:3
m1:4
m1:5
m1:6
m1:7
m1:8
m1:9
m1:10
m1:11
m1:12
m1:13
m1:14
m1:15
m1:16
m1:17
m1:18
m1:19
m1:20
m1:21
m1:22
m1:23
m1:24
m1:25
m1:26
m1:27
m1:28
m1:29
m1:30
m1:31
m1:32
m1:33
m1:34
m1:35
m1:36
m1:37
m1:38
m1:39
m1:40
m1:41
m1:42
m1:43
m1:44
m1:45
m1:46
m1:47
m1:48
m1:49
main:end

Tags:  多线程支持库1.1版 多线程编程 java多线程 多线程

延伸阅读

最新评论

发表评论