2024-04-30 15:42:07 | 我爱编程网
如题,有时候我们需要在Main函数中写测试代码,并且需要在异步线程中执行任务,任务执行完之后才退出主线程,如何做到的呢,请看如下代码:
[java] view plain copy
public class TestMain {
/**
* @param args
*/
public static void main(String[] args) {
System.out.println("-------work------start---------");
LockHandler mHandler=new LockHandler();
Thread mThread=new Thread(new WorkRunnable(mHandler));
mThread.setDaemon(true);
mThread.start();
mHandler.waitForDebug();
System.out.println("-------work------end---------");
}
public static class WorkRunnable implements Runnable
{
public LockHandler mHandler;
public WorkRunnable(LockHandler mHandler)
this.mHandler = mHandler;
}
public void run() {
//TODO
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("-------我在异步线程中睡了五秒---------");
mHandler.notifytForDebug();
}
}
public static class LockHandler
{
public synchronized void waitForDebug()
{
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public synchronized void notifytForDebug()
{
this.notifyAll();
}
}
}
执行结果:
-------work------start---------
-------我在异步线程中睡了五秒---------
-------work------end---------
只需要重写WorkRunnable类的run()方法.
其实最佳答案的说法是有问题的,如果题主指的结束,是指方法块语句的执行结束的话,热心网友的说法是对的。但是对于线程本身,所有线程(包括主线程)在启动后都被CPU参照
优先级
交替调用,运行的顺序是无法预测的,但最后结束的一定是主线程。
网上有部分说法,展示的代码运行结果,“主线程先于其他线程结束,并不影响其他线程的运行”只有后半部分是对的。因为方法体(不管是自定义线程的run()还是主线程的main())中全部语句的执行完毕不代表所在线程的结束,可以用activeCount()返回当前运行的总线程数来验证这一点。另外,如果将自定义的线程对象设定为守护线程(setDeamon()),也可以很清楚看到即便main()方法中最后一句输出语句执行完毕,控制台仍会根据该自定义线程run()方法体的内容继续输出,这证明主线程还没结束——因为当线程组中只剩下守护线程时,JVM虚拟机会自动退出,如果主线程已经结束,唯一活动的线程在被设置成守护线程的情况下,程序会直接结束运行,不可能继续输出。
我爱编程网(https://www.52biancheng.com)小编还为大家带来java 如何让一个程序运行一段时间后就停止运行的相关内容。
public static void main(String[] args) {
long begain = System.currentTimeMillis();//开始系统时间
try {
Thread.sleep(100);
} catch (Exception e) {
e.printStackTrace();
}
long CheckTime = System.currentTimeMillis(); //判断时间
while(true){
System.out.println(CheckTime-begain);
try {
Thread.sleep(1000);
} catch (Exception e) {
e.printStackTrace();
}
CheckTime = System.currentTimeMillis();
if((CheckTime-begain)>=(30*1000)){//判断时候到30秒
System.out.println("30秒后结束");
break;
}
}
}
给你的答案希望你能满意
2025-02-01 20:24:39
2025-02-10 15:19:48
2025-01-28 17:58:32
2024-11-22 05:08:01
2024-09-10 08:50:00
2024-01-05 14:11:24