多线程的问题

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

如果把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

(上述只注意over的值)


这样子就很明显了,t.join(int wait_time);后面的代码想要执行需要满足以下条件之一:
1、线程t死了;
2、等待时间超过wait_time;

如果没有指定wait_time就只能等线程t死了才行了···



这样应该好理解一点:
1. 调用join()方法的线程将被优先执行,直到此线程运行结束,当前线程才能继续运行
2. 调用join(long mills)方法的线程将被优先执行, 直到此线程运行结束或者等待运行时间超过mills时间,当前线程才能继续运行

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值