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
责任编辑:小草