一、线程睡眠:sleep()
当我们想要暂时暂停一个线程的时候,可以调用 Thread.sleep() 方法,传入参数为睡眠时间(单位是毫秒)。另外,这个方法必须处理 InterruptedException,因为线程在睡眠的时候可能被终止。
public class Main {
public static void main(String[] args) {
Thread play = new Thread() {
@Override
public void run() {
int second = 0;
while (true) {
try {
Thread.sleep(1000);
}
catch (InterruptedException e) {
System.out.println(e);
}
System.out.printf("已经玩了%d秒\n", ++second);
if (second >= 20) break;
}
}
};
play.start();
}
}
二、线程优先级:setPriority()
程序是无限的,资源是有限的,为了使用有限的资源来尽可能多的完成任务,操作系统引入了线程优先级的概念。优先级越高,系统越会优先将CPU,显卡等宝贵资源分配给这个线程,优先满足它的运行要求。
不知道为啥,大多数操作系统都是只设置了从 1 到 10 的十挡,数字越大,优先级越高,Java 里面也采用了这一概念。
public class Main {
public static void main(String[] args) {
Thread play = new Thread();
play.setPriority(7);//比较高的优先级
play.setPriority(2);//比较低的优先级
play.setPriority(Thread.MAX_PRIORITY);//最高优先级
play.setPriority(Thread.MIN_PRIORITY);//最低优先级
play.setPriority(Thread.NORM_PRIORITY);//正常优先级
//设置了不合法的参数,会抛出异常
try {
play.setPriority(-1);
}
catch (IllegalArgumentException e) {
System.out.println("参数异常,被驳回");
}
}
}
三、线程暂停:yield()
当有时有必要的时候,可以调用这一方法,暂时暂停某个线程,把资源让出来给别人用(或者别的目的)。等到需要的时候,再使用 start() 来开启它。
附:和sleep() 一样,这也是个静态方法。
Thread.yield();
四、守护线程:setDaemon()
有这么一类线程,它们不抛头露面,但是却隐藏在界面背后,默默支撑着程序的运行(例如各类杀软都有很多守护线程,还有 JVM 的垃圾回收线程之类)。
和守护线程相对的是用户线程,这些线程一般直接展示给用户。如果一个程序的用户线程已经不再存在,那么守护线程也就没有了存在必要,也会自动关闭。(打个比方,一个公司的销售,研发部门啥的都是用户线程,财政,保安部门就是守护线程,如果公司倒闭了,销售研发啥的都关闭了,那么财政保安啥的也就没有了服务对象,也会自动关闭)。
这个细究下去能挖一片,例如系统安全,操作系统原理啥的。但是我们暂时不管那么多,只需要知道我们如何设定一个线程的属性即可。
Thread ProtectTask = new Thread();
ProtectTask.setDaemon(true);//设为守护线程
ProtectTask.setDaemon(false);//取消其守护线程的特性
五、加入到目前线程之中
先介绍一下主线程的概念:当前正在运行的线程叫做主线程。
这时候,我们可以执行 其他线程的 join() 方法,这时候这个线程就会插入到这个主线程中开始执行,在这个线程执行结束前,原本的主线程将会被挂起,直到该线程执行完毕后才会继续执行。(当然,这并不影响其他线程的并行)
public class Main {
public static void main(String[] args) throws Exception {
Thread cyh = new Thread() {
@Override
public void run() {
for (int i = 0; i < 7; ++i)
System.out.println("cyh");//可以直接用外部的变量哦
}
};
//记得先start
cyh.start();
//我的电脑上面,cyh开始了后被暂时挂起,系统依旧在执行main线程
for (int i = 0; i < 3; ++i)
System.out.println("jhw");
//cyh线程加入了,该线程会一直运行下去,直到结束之后才会回到main线程
cyh.join();
//cyh线程执行结束之后,系统才回到main线程,继续执行剩下的语句
for (int i = 0; i < 4; ++i)
System.out.println("jhw");
}
}