1.休眠
Thread.sleep(3000);//线程休眠3秒
使得当前正在执行的线程休眠一段时间,释放时间片,导致线程进入阻塞状态
sleep(3000),3000的单位是毫秒,设置了sleep就相当于将当前线程挂起5s,这个操作跟线程的优先级无关,当对应的时间到了之后,还会再继续执行
2.合并线程
public class Demo3 {
public static void main(String[] args) {
for(int i=0; i<100; i++){
System.out.println(Thread.currentThread().getName()+":"+i);
//当i=20 合并线程
if(i==20){
//创建合并过来的线程
CustomThread t=new CustomThread("合并的线程");
t.start();
try {
//合并线程
t.join();
//合并过来的线程,执行结束后,主线程才会继续执行
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
在执行原来线程的过程中,如果遇到了合并线程,则优先执行合并进来的线程,执行完合并进来的线程后,再回到原来的任务中,继续执行原来的线程
特点:
- 1)线程合并,当前线程一定会释放cpu时间片,cpu会将时间片分给要Join的线程
- 2)哪个线程需要合并就在当前线程中,添加要合并的线程
- 3)join之前,一定要将线程处于准备状态start
3.设置线程优先级
可以通过设置优先级来改变线程抢到时间片的概率,优先级高的线程获得较多的执行机会
1)默认情况下,每个线程的优先级都与创建它的父线程具有相同的优先级,例如:main线程具有普通优先级,则由main线程创建的子线程也有相同的普通优先级
2)所传的参数范围1~10,默认为5,对应的数值越大,说明优先级越高,这个方法的设置一定要在start之前
线程的优先级低并不意味着争抢不到时间片,只是抢到时间片的概率比较低而已
4.后台线程
public class Demo4 {
public static void main(String[] args) {
// TODO Auto-generated method stub
//后台线程
DaemonThread dt=new DaemonThread();
//设置为后台线程
dt.setDaemon(true);
//一定在start之前设置
dt.start();
//主线程任务
for(int i=0; i<100; i++){
System.out.println(Thread.currentThread().getName()+":"+i);
}
}
}
隐藏起来一直在默默运行的线程,直到进程结束,又被称为守护线程或精灵线程,JVM的垃圾回收线程就是典型的后台线程
特征:如果所有的前台线程都死亡,后台线程会自动死亡,必须要在start之前执行
5.线程让步
public class YieldThread extends Thread {
public YieldThread(){
}
public YieldThread(String name){
super(name);
}
public void run(){
for(int i=0; i<50; i++){
System.out.println(Thread.currentThread().getName()+":"+i);
//当i=20时 线程让步
if(i==20){
System.out.println(Thread.currentThread().getName()+"开始让步");
Thread.yield();
}
}
}
}
主类:
public class Demo5 {
public static void main(String[] args) {
// TODO Auto-generated method stub
//线程让步
YieldThread t0=new YieldThread("线程0");
t0.start();
YieldThread t1=new YieldThread("线程1");
t1.start();
}
}
-
可以让当前正在执行的线程暂停,但它不会阻塞该线程,他只是将该线程转入就绪状态,完全可能出现的情况是:当某个线程调用了yield方法暂停之后,线程调度器又将其调度出来重新执行
-
实际上,当某个线程调用了yield方法暂停之后,只有优先级与当前线程相同,或者优先级比当前线程更高的就绪状态的线程才会获得执行的机会
处于Running状态的线程,如何进入到阻塞Blocked状态?
1、sleep
(睡眠时间,毫秒为单位) 睡眠时间结束后,自动进入到Runnable可运行状态
2、join()
当前线程停止,执行合并过来的线程,当合并过来的线程执行结束后,继续执行之前的线程