JAVA中提供了一些方法用来控制线程的执行。
1、join方法:由Thread提供,作用:让一个线程等待另一个线程完成的方法。a线程中调用b线程的join方法,那么a线程将被阻塞,直到b线程执行完毕。
public class JoinThread extends Thread{
public JoinThread(String name){
super(name);
}
public void run(){
for(int i=0;i<100;i++){
System.out.println(getName()+" "+i);
}
}
public static void main(String[] args) throws InterruptedException{
new JoinThread("新线程").start(); //启动子线程
for(int i=0;i<100;i++){
if (i==20) {
JoinThread jt=new JoinThread("被Join的线程");
jt.start();
jt.join();//main线程调用了jt线程的join方法,main线程必须等到jt执行结束后才能继续向下执行
}
System.out.println(Thread.currentThread().getName()+" "+i);
}
}
}
上述代码中,总共有三个线程,main,线程
1
、线程
2
,在i=
20
时,由于main线程中调用了线程
2
的join方法,所以main线程进入阻塞状态,只有线程
1
和线程
2
会被执行。因此输出结果为
- .........
- 被Join的线程 93
- 被Join的线程 94
- 被Join的线程 95
- 被Join的线程 96
- 被Join的线程 97
- 被Join的线程 98
- 被Join的线程 99
- main 20
- main 21
- main 22
- main 23
- main 24
- main 25
- ........
2、后台线程:后台线程(Daemon Thread)的任务:为其他线程服务。例如:JVM的垃圾回收器。特征:如果所有的前台线程死亡,后台线程会自动死亡。设置的方法:通过调用Thread对象的setDaemon(true)方法可以把一个线程设置为后台线程。
public class DaemonThread extends Thread{
public void run(){
for(int i=0;i<1000;i++){
System.out.println(getName()+" "+i);
}
}
public static void main(String[] args){
DaemonThread dt=new DaemonThread();
dt.setDaemon(true); //设置为后台线程,后台线程的一个重要特征:所有前台线程都死亡,这个后台线程才会死亡。
dt.start();
for(int i=0;i<10;i++){
System.out.println(Thread.currentThread().getName()+" "+i);
}
}
}
3
、sleep:作用:让当前正在执行的线程暂停一段时间,并进入阻塞状态。调用方法:Thread.sleep(
long
millis)。还有一种调用方法精确到毫微秒,很少用。
public class SleepTest {
public static void main(String[] args) throws InterruptedException{
for(int i=0;i<10;i++){
System.out.println("当前时间"+new Date());
Thread.sleep(1000); //当前只有只有一个主线程,暂停该线程1秒。结果为每秒输出一个字符串,显示当前时间
}
}
}
4
、yield:作用;线程让步,也是Thread中的一个静态方法,让当前线程进入就绪状态,而不是阻塞状态,相当于通知系统的线程调度器,你重新进行一次调度。而实际上,当某个线程被yield暂停之后,只有优先级与当前线程相同或者比当前优先级更高的线程才能获得执行的机会。
5、线程的优先级:每个线程都有一定的优先级,优先级高的线程获得更多的机会,低的获得较少的机会。这并不是说,a的优先级比b高,b一定要在a执行完才能执行,而是a线程执行的概率更大一些,至于怎么样执行,仍有线程调度器来决定。