「java退出主线程」java线程
本篇文章给大家谈谈java退出主线程,以及java线程对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。
本文目录一览:
Java 怎么在Main函数中,执行完异步任务后才退出主线程
如题,有时候我们需要在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主线程结束和子线程结束
你应该换成main函数运行,abcd就一定会打印出来了
问题并不是出在主线程和子线程身上,事实上Java似乎也没有严格主线程和子线程的概念,取而代之的是普通线程和后台线程
但是这里你采用@Test来运行代码,而@Test是JUnit测试框架使用的注解,JUnit在进行单元测试的时候,如果被@Test注释的方法执行完成,那么内部开启的线程也会被强制退出,退出是测试框架进行的操作
这和Java承诺的普通线程不退出程序就不结束是不相符的,如果书上告诉你会输出两个但是你执行了只输出了一个那么很可能就是这里出了问题
而通过main函数则没有框架干预,根据Java的规则只要有普通线程没有退出,程序就不会完全退出(System.exit强制自杀除外),那么除非创建的线程被设置成了后台线程(或者叫守护线程,daemon),那么才会在主线程退出时自动关闭这些后台线程,就是你遇到的偶尔可以输出abcd偶尔不行的效果,否则一定会abcd和efgh两个都输出,只不过输出顺序可能不一致
java线程如何停止?
通过调用interrupt方法可以使得处于阻塞状态的线程抛出一个异常,即interrupt方法可以用来中断一个正处于阻塞状态的线程;另外,改方法还会设置线程的中断状态(注:isInterrupted()可以用来查询中断状态)。
线程阻塞在reader.readLine()时,即使主线程改变了标志变量,但是并不能立即结束子线程,只有等待阻塞被打破,且运行到下一次循环条件判断的时候才能终止。所以在使用这种方法时,应该考虑到阻塞这种情况。当然,如果整个循环内的操作属于同一事务时,这种方法倒很不错。
调用线程对象的interrupt()时,sleep的线程会抛出InterruptedException异常,从而中断循环,终止线程。但是如果是IO如输入这些阻塞,中断的方法又不起作用了,还有就是对于没有阻塞的线程,调用interrupt()是达不到终止线程的效果的。
java退出主线程的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于java线程、java退出主线程的信息别忘了在本站进行查找喔。