1.join:合并线程
调用.join()时,其他线程要等该线程执行完毕后才执行
我们先新建个JoinDemo类
public class JoinDemo extends Thread{
public static void main(String[] args) throws InterruptedException {
JoinDemo jd= new JoinDemo();
Thread t = new Thread(jd);//新生
t.start();//就绪
//CPU调度运行
for(int i=0;i<1000;i++){
//一开始两个线程交替进行,当main=50时t.join(),等待t执行完再执行main
if(i==50){
t.join();//此时main方法阻塞,等待join执行完
}
System.out.println("main..."+i);
}
}
public void run() {
for(int i=0;i<1000;i++){
System.out.println("join..."+i);
}
}
}
这是运行结果的一部分截图
在main50之前,main和join交替执行,当i=50,main要等join执行完毕
2.yield:暂停自己的线程
用一个例子YieldDemo类来说明下
public class YieldDemo extends Thread{
public static void main(String[] args) {
YieldDemo yd = new YieldDemo();
Thread t = new Thread(yd);//新生
t.start();//就绪
for (int i= 0;i<1000;i++){
/*i%20==0时
* 该线程就会把CPU时间让掉
* 让其他或者自己的线程执行
* (也就是谁先抢到谁执行)
*/
if(i%20==0){
Thread.yield();//写在那个线程就暂停哪个
}
System.out.println("main..."+i);
}
}
public void run(){
for (int i=0;i<1000;i++){
System.out.println("yield........"+i);
}
}
}
3.sleep:休眠(不释放锁)
1)与时间相关:倒计时
2)网络延时
先建一个类来模拟倒计时
public class SleepDemo {
public static void main(String[] args) throws InterruptedException {
int num=10;
while(true){
System.out.println(num--);
Thread.sleep(1000);//暂停
if(num<=0){
break;
}
}
}
}
sleep(1000)即暂停一秒
接下来我们举一个购票的例子来讲一下网络延时,新建一个Web12306类
class Web12306 implements Runnable{
private int num=50;
public void run(){
while (true){
if(num<=0){
break;//跳出循环
}
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"抢到了票,票还剩"+num--);
}
}
}
当票数小于等于0时退出循环
再建一个SleepDemo02类来实现
public class SleepDemo02 {
public static void main(String[] args) {
Web12306 web = new Web12306();//真实角色
Thread t1=new Thread(web,"路人甲");//代理角色
Thread t2=new Thread(web,"黄牛乙");
Thread t3=new Thread(web,"攻城狮");
t1.start();//启动线程
t2.start();
t3.start();
}
}