线程控制

本文详细介绍了Java中线程的基本概念,包括线程的创建、启动、同步、睡眠和让步等核心操作,通过具体示例展示了如何在实际应用中合理利用线程提高程序效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值