线程控制

1.join 线程

Thread提供了让一个线程等待另一个线程完成的方法:join()方法。当在某个程序执行流中调用其他线程的join()方法时,调用线程将被阻塞,直到被join方法加入的join线程完成为止。如下面程序所示:

public class JoinThread extends Thread
{
 public JoinThread(String name)
 {
  super(name);
 }
 public void run()
 {
  for(int i=0;i<5;i++)
  {
   System.out.println(Thread.currentThread().getName()+""+i);
  }
  
 }
 public static void main(String[] args) throws InterruptedException
 {
  new JoinThread("新线程").start();
  for(int i=0;i<10;i++)
  {
   if(i==5)
   {
    JoinThread jt=new JoinThread("被Join的线程");
    jt.start();
    //main线程调用了jt线程的join方法,main线程
    //必须等到jt执行结束才会向下执行
    jt.join();
    
   }
   System.out.println(Thread.currentThread().getName()+""+i);
  }
 }
}

运行后显示当循环变量i等于5时,启动了名为“被Join的线程”的线程,该线程不会和main线程并发执行,而是main线程必须等待该线程执行结束后才可以向下执行。

新线程0
main0
新线程1
main1
新线程2
main2
新线程3
main3
新线程4
main4
被Join的线程0
被Join的线程1
被Join的线程2
被Join的线程3
被Join的线程4

main5
main6

main7
main8
main9



2.后台线程

有一种线程,它是在后台运行的,它的任务是为其他的线程提供服务,这种线程被称为“后台线程”(Daemon Thread),又称为“守护线程”或“精灵线程”。JVM垃圾回收线程就是典型的后台线程。

       后台线程有个特点:如果所有的前台线程都死亡,后台线程会自动死亡。调用Thread对象的setDaemon(true)方法可将指定线程设置成后台线程。

3.线程睡眠:sleep

       如果我们需要让当前正在执行的线程暂停一段时间,并进入阻塞状态,则可以通过调用Thread类的静态sleep方法,sleep方法有两种重载的形式:

(1)static void sleep(long millis):让当前正在执行的线程暂停millis毫秒,并进入阻塞状状态。

(2)static void sleep(long millis,int nanos):让当前正在执行的线程暂停millis毫秒加nanos毫秒,并进入阻塞状态。

       程序很少调用第二种形式的sleep方法。
4.线程让步:yield

       yield()方法是一个和sleep方法有点相似的方法,它也是一个Thread类提供的一个静态方法,它可以让当前正在执行的线程暂停,但它不会阻塞该线程,它只是将该线程转入就绪状态。yield只是让当前线程暂停一下,让系统的线程调度器重新调度一次,完全可能的情况是:当某个线程调用了yield方法暂停之后,线程调度又将其调度出来重新执行。

       实际上,当某个线程调用了yield方法暂停之后,只有优先级与当前线程相同,或者优先级比当前线程更高的就绪线程才会获得执行的机会。下面的程序使用yield来让当前正在执行的线程暂停:

public class TestYield extends Thread

{

public TestYield()

{

}

public TestYield(String name)

{

super(name);

}

public void run()

{

for(int i=0;i<50;i++)

{

System.out.prinln(getName()+""+i);

if(i==20)

{

Thread.yield();

}

}

}

public static void main(String[] args)

{

TestYield try1=new TestYield("高级");

try1.setPripority(Thread.MAX_PRIORITY);

try1.start();

TestYield try2=new TestYield("低级");

try2.setPripority(Thread.MIN_PRIORITY);

try2.start();

}

}

 

运行结果:

高级0
高级1
高级2
高级3
高级4
高级5
高级6
高级7
高级8
高级9
高级10
高级11
低级0
低级1
高级12
高级13
高级14
高级15
高级16
高级17
高级18
高级19
高级20
高级21
高级22



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值