如何确保main方法所在的线程是java程序最后结束的线程如何确保
答案:2 悬赏:60 手机版
解决时间 2021-03-05 22:50
- 提问者网友:原来太熟悉了会陌生
- 2021-03-05 19:02
如何确保main方法所在的线程是java程序最后结束的线程如何确保
最佳答案
- 五星知识达人网友:蓝房子
- 2021-03-05 19:54
首先先了解如果在main方法中启动多线程,在其他线程均未执行完成之前,main方法线程会不会提前退出呢?答案是肯定的:
1、JVM会在所有的非守护线程(用户线程)执行完毕后退出;
2、main线程是用户线程;
3、仅有main线程一个用户线程执行完毕,不能决定JVM是否退出,也即是说main线程并不一定是最后一个退出的线程。
所以如果需要确保main方法所在的线程是JVM中最后结束的线程,这里就需要用到Thread类的join()方法:
在一个线程中启动另外一个线程的join方法,当前线程将会挂起,而执行被启动的线程,知道被启动的线程执行完毕后,当前线程才开始执行。
具体实现可参看代码:
class Thread1 extends Thread
{
public Thread1(String threadName)
{
super(threadName);
}
public void run()
{
System.out.println(getName() + "is running");
try
{
sleep(2000);
}
catch (InterruptedException e)
{
e.printStackTrace();
}
}
}
class Thread2 extends Thread
{
private Thread1 thread1;
public Thread2(String threadName, Thread1 thread1)
{
super(threadName);
this.thread1 = thread1;
}
public void run()
{
System.out.println(getName() + "is running");
try
{
thread1.start();
thread1.join();
}
catch (InterruptedException e)
{
e.printStackTrace();
}
System.out.println("thread2 is over");
}
}
public class JoinTest
{
public static void main(String[] args)
{
Thread1 thread1 = new Thread1("Thread1");
Thread2 thread2 = new Thread2("Thread2", thread1);
thread2.start();
}
}在thead2中调用thread1的join()方法,让thread1中断thread2自身的运行,运行程序首先输出thread2 is running,然后输出thread1 is running, 过了两秒钟之后,才输出thread2 is over,这就说明在thread2中调用thread1的join()方法,thread2自身被中断了,转而执行thread1,等待thread1执行完毕之后,再转过来执行thread2。
1、JVM会在所有的非守护线程(用户线程)执行完毕后退出;
2、main线程是用户线程;
3、仅有main线程一个用户线程执行完毕,不能决定JVM是否退出,也即是说main线程并不一定是最后一个退出的线程。
所以如果需要确保main方法所在的线程是JVM中最后结束的线程,这里就需要用到Thread类的join()方法:
在一个线程中启动另外一个线程的join方法,当前线程将会挂起,而执行被启动的线程,知道被启动的线程执行完毕后,当前线程才开始执行。
具体实现可参看代码:
class Thread1 extends Thread
{
public Thread1(String threadName)
{
super(threadName);
}
public void run()
{
System.out.println(getName() + "is running");
try
{
sleep(2000);
}
catch (InterruptedException e)
{
e.printStackTrace();
}
}
}
class Thread2 extends Thread
{
private Thread1 thread1;
public Thread2(String threadName, Thread1 thread1)
{
super(threadName);
this.thread1 = thread1;
}
public void run()
{
System.out.println(getName() + "is running");
try
{
thread1.start();
thread1.join();
}
catch (InterruptedException e)
{
e.printStackTrace();
}
System.out.println("thread2 is over");
}
}
public class JoinTest
{
public static void main(String[] args)
{
Thread1 thread1 = new Thread1("Thread1");
Thread2 thread2 = new Thread2("Thread2", thread1);
thread2.start();
}
}在thead2中调用thread1的join()方法,让thread1中断thread2自身的运行,运行程序首先输出thread2 is running,然后输出thread1 is running, 过了两秒钟之后,才输出thread2 is over,这就说明在thread2中调用thread1的join()方法,thread2自身被中断了,转而执行thread1,等待thread1执行完毕之后,再转过来执行thread2。
全部回答
- 1楼网友:举杯邀酒敬孤独
- 2021-03-05 21:06
要实现这个情况,必须知道以下几点
1、java中线程的结束是由run方法运行完成后自动结束的
2、在main线程(主线程)中,需要得到所有线程的引用。
3、知道jdk提供的countdownlatch的用法
例子如下:
public static void main(string[] args) throws interruptedexception
{
//countdownlatch作为计数器纪录有几个线程,例如有2个线程
countdownlatch latch=new countdownlatch(2);
worker worker1=new worker( latch);
worker worker2=new worker(latch);
worker1.start();// 启动线程
worker2.start();//
//等待所有工人完成工作
latch.await();
system.out.println("all work done at "+sdf.format(new date()));
}
class worker extends thread
{
private countdownlatch latch;
public worker(countdownlatch latch)
{
this.latch = latch;
}
public void run()
{
xxxxx
//在run方法结束之前,讲线程计数器减一
latch.countdown();
}
}
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯