Java 怎么在Main函数中,执行完异步任务后才退出主线程
3个回答
展开全部
如题,有时候我们需要在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()方法.
[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()方法.
2016-07-27 · 百度知道合伙人官方认证企业
育知同创教育
1【专注:Python+人工智能|Java大数据|HTML5培训】 2【免费提供名师直播课堂、公开课及视频教程】 3【地址:北京市昌平区三旗百汇物美大卖场2层,微信公众号:yuzhitc】
向TA提问
关注
展开全部
要实现这个情况,必须知道以下几点
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();
}
}
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();
}
}
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
你能说下目的吗。可以加个navtice变量,子线程完成后设为true, 主线程加个while循环,当这个变更为true时,结束循环,也就自动结束了
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询