多线程基础(四)线程控制
系列目录
线程控制
1.join
/**
* 此案例用于演示Join方法
* 某线程中,join了其他线程,本线程需等待(被阻塞)其他线程处理完毕才能执行
*
*
*
*/
public class JoinThread extends Thread {
public JoinThread(String name){
super(name);
}
@Override
public void run(){
for(int i=0;i<100;i++){
System.out.println(getName()+" "+i);
}
}
public static void main(String[] args) throws InterruptedException {
for(int i=0;i<100;i++){
if(i==20){
JoinThread jt = new JoinThread("被join的线程");
jt.start();
jt.join();
}
System.out.println(Thread.currentThread().getName()+" "+i);
}
}
}
2.后台线程
后台线程又称为守护线程、精灵线程。
与之对应的是:前台线程、被守护线程。
- 特点:当所有前台线程结束后,后台也会随之结束;
后台线程也可以在前台线程之前结束。 - 常见的后台线程:
GC:垃圾回收器 - 前台线程:
Main线程 - 实现方式:
在需要成为守护线程的线程对象上调用setDaemon方法,
把当前线程设置成了守护线程。
【案例】
package myThread;
/**
* 此案例用于演示后台线程。
* 一旦所有前台线程运行完,后台线程就自行结束了
*
* 注:
* 1.前台线程创建的子线程默认为前台线程,后台线程创建的子线程默认为后台线程
* 2.设置后台线程需要在启动线程之前
*/
public class DaemonThread extends Thread{
@Override
public void run(){
for(int i=0;i<100;i++){
System.out.println(getName()+" "+i);
}
}
public static void main(String[] args) {
DaemonThread daemonThread = new DaemonThread();
daemonThread.setDaemon(true);
daemonThread.start();
for(int i=0;i<10;i++){
System.out.println(Thread.currentThread().getName()+" "+i);
}
}
}
3.线程睡眠 sleep()
与yield方法的区别:
- sleep进入阻塞,yield进入就绪。
- sleep方法暂停线程后,处理机不会理会争抢线程的优先级。
yield方法只会给相同及更高优先级的线程执行机会。 - yield不会抛出异常。
- sleep方法有更好的移植性,不推荐后者.
4.线程优先级
一般而言,操作系统设置了1-10个等级,默认等级5,数字越大,等级越高。
但为了避免差异,最好使用Thread类的三个即静态常量:
- MAX_PRIORITY=10
- MIN_PRIORITY=1
- NORM_PRIORITY=5
注意:
调整优先级,只是调整抢占CPU的概率,但是不能保证一定是优先级高的执行。
【案例】
package myThread;
public class PriorityTest extends Thread{
public PriorityTest(String name){
super(name);
}
@Override
public void run(){
for(int i=0;i<100;i++){
System.out.println(getName()+" 当前优先级是:"+getPriority()+",当前遍历数是:"+i);
}
}
public static void main(String[] args) {
Thread.currentThread().setPriority(6);
for(int i=0;i<30;i++){
if(i==10){
PriorityTest low = new PriorityTest("低级");
low.start();
System.out.println(low.getName()+"创建之初的优先级为:"+low.getPriority());
low.setPriority(MIN_PRIORITY);
}
if(i==20){
PriorityTest high = new PriorityTest("高级");
high.start();
System.out.println(high.getName()+"创建之初的优先级为:"+high.getPriority());
high.setPriority(MAX_PRIORITY);
}
}
}
}