1、调用Thread.sleep():使当前线程睡眠至少多少毫秒(尽管它可能在指定的时间之前被中断)。
2、调用Thread.yield():不能保障太多事情,尽管通常它会让当前运行线程回到可
运行性状态
,使得有相同优先级的线程有机会执行。
3、调用join()方法:保证当前线程停止执行,直到该线程所加入的线程完成为止。然而,如果它加入的线程没有存活,则当前线程不需要停止。
除了以上三种方式外,还有下面几种特殊情况可能使线程离开运行状态:
1、线程的run()方法完成。
2、在
对象
上调用wait()方法(不是在线程上调用)。
3、线程不能在对象上获得锁定,它正试图运行该对象的方法代码。
4、线程调度程序可以决定将当前运行状态移动到可运行状态,以便让另一个线程获得运行机会,而不需要任何理由。
关于join的一些问题:
public class JoinThread extends Thread{
public JoinThread(String name){
super(name);
}
public void run(){
for(int i = 0;i < 10; i++){
for(long k = 0; k < 1900000000; k++){}
System.out.println(this.getName() +": " + i);
}
}
public static void main(String[] args){
Thread t1 = new JoinThread("AA AA");
t1.start();
try {
long time1 =System.currentTimeMillis();
t1.join(1000);
long time2 = System.currentTimeMillis();
System.out.println(time2-time1);//等待时间超过了1000,所以后面的代码执行了
} catch (Exception e) {
// TODO: handle exception
}
System.out.println("over");
}
}
上面的代码的执行结果为:
AA AA: 0
1006
over
AA AA: 1
AA AA: 2
AA AA: 3
AA AA: 4
AA AA: 5
AA AA: 6
AA AA: 7
AA AA: 8
AA AA: 9
1006
over
AA AA: 1
AA AA: 2
AA AA: 3
AA AA: 4
AA AA: 5
AA AA: 6
AA AA: 7
AA AA: 8
AA AA: 9
如果把for循环中k<后面的值改小,或者join(1000)换成join()则代码执行结果类似
AA AA: 0
AA AA: 1
AA AA: 2
AA AA: 3
AA AA: 4
AA AA: 5
AA AA: 6
AA AA: 7
AA AA: 8
AA AA: 9
over
AA AA: 1
AA AA: 2
AA AA: 3
AA AA: 4
AA AA: 5
AA AA: 6
AA AA: 7
AA AA: 8
AA AA: 9
over
(上述只注意over的值)
这样子就很明显了,t.join(int wait_time);后面的代码想要执行需要满足以下条件之一:
1、线程t死了;
2、等待时间超过wait_time;
如果没有指定wait_time就只能等线程t死了才行了···
1、线程t死了;
2、等待时间超过wait_time;
如果没有指定wait_time就只能等线程t死了才行了···
这样应该好理解一点:
1. 调用join()方法的线程将被优先执行,直到此线程运行结束,当前线程才能继续运行
2. 调用join(long mills)方法的线程将被优先执行, 直到此线程运行结束或者等待运行时间超过mills时间,当前线程才能继续运行
1. 调用join()方法的线程将被优先执行,直到此线程运行结束,当前线程才能继续运行
2. 调用join(long mills)方法的线程将被优先执行, 直到此线程运行结束或者等待运行时间超过mills时间,当前线程才能继续运行