⑴ 为什么主线程结束,子线程不结束
Thread有守护线程和非守护线程之分。
守护线程在主线程运行结束后,也会结束运行,而非守护线程不会结束。
线程默认都是非守护线程。可以使用thread.setDeamon方法来设置。
system.exit(0); 代表退出进程,无论什么线程都退出。
下述代码,即使不加System.exit(0),在主线程结束后,其守护线程也会随之中止。
public class t {
public static void main(String[] args) {
System.out.println("kaishi");
asd th = new asd();
th.setDaemon(true);
th.start();
System.out.println(System.currentTimeMillis());
System.out.println("tuichu");
System.out.println(Thread.currentThread().getName()+System.currentTimeMillis());
//System.exit(0);
}
}
class asd extends Thread {
public void run() {
while (true) {
System.out.println(Thread.currentThread().getName()+System.currentTimeMillis());
}
}
⑵ java 线程激活和终止,主线程和子线程之间的关系
是一个线程也是一个进程,一个java程序启动后它就是一个进程,进程相当于一个空盒,它只提供资源装载的空间,具体的调度并不是由进程来完成的,而是由线程来完成的。一个java程序从main开始之后,进程启动,为整个程序提供各种资源,而此时将启动一个线程,这个线程就是主线程,它将调度资源,进行具体的操作。Thread、Runnable的开启的线程是主线程下的子线程,是父子关系,此时该java程序即为多线程的,这些线程共同进行资源的调度和执行。
⑶ java主线程关闭,其它子线程还能不能运行
public class ThreadTest { static int i=0; public static void main(String[]args){ //建立3个子线程,以i,i,n,m作为子线程是否结束的判断 //当所有子线程运行完才开始主线程 System.out.println("主线程开始"); Thread t1=new Thread(){
⑷ Java主线程如何等待子线程执行结束
java.util.concurrent.CountDownLatch 这个类可以实现你所要的功能
例如:CountDownLatch latch = new CountDownLatch(5) //声明计数器为5个
Thread t = new Thread() {
public void run() {
try {
//TODO 你的应用
} catch (Exception e) {
//TODO 异常处理
}
finally {
latch.countDown(); //这句是关键
System.out.println("ok"); //5个线程都跑完后输出
}
}
};
t.start();
然后让以上操作循环五次(就是说同时开5个线程),那么这个"ok"就会在等到这5个线程都ok后才会被输出一次。
⑸ Java父线程停止时如何也将子线程停止
从某种程度上讲,做不到。
不管是父线程还是子线程,这只不过是在运行时谁建了谁时用的,一旦所谓的字线程被启动,这两个线程是没有先后贵贱区分的。
任何线程是没有办法把另外一个线程终止的。
如果你一定想你说的那样是线的话,下面是唯一个可行方案。在"父线程"建立“子线程”时,把“父线程”的instance传过去,在“子线程”里,不停的check"父线程"是否还存活,如果否,停止。
相反的,如果"父线程"需要在"子线程"终了时结束,在"父线程"建立“子线程”时,留住“子线程”的instance然后keep
checking
whether
it's
still
alive.
⑹ java 主线程已经执行完了,为什么子线程还在运行
其实是子线程运行结束后主线程才退出的。因为是子线程开启后,主线程和子线程的代码同时继续运行。当主线程的代码全部执行完后,若子线程还没执行完,主线程会等待子线程执行结束后退出程序。
⑺ java 主线程结束,子线程会结束吗
如果你说的是“进程”的话,那么就会退出。一个进程的退出,那么其里面的所有东西都会释放。 但是,如果你是在一个进程里面,建立线程P,然后再在线程P里面创建并且运行线程C1、c2等,那么,当线程P退出的时候,线程c1 c2是不会退出的。
⑻ 主线程什么都没做,就会等待子线程结束。这是为什么
你这个主线程没有等子线程先执行,主线程几个字不先打出来吗,你可以在主线程里面用 a1.join(); 这样主线程就会等子线程先执行。
⑼ java主线程结束和子线程结束
你应该换成main函数运行,abcd就一定会打印出来了
问题并不是出在主线程和子线程身上,事实上Java似乎也没有严格主线程和子线程的概念,取而代之的是普通线程和后台线程
但是这里你采用@Test来运行代码,而@Test是JUnit测试框架使用的注解,JUnit在进行单元测试的时候,如果被@Test注释的方法执行完成,那么内部开启的线程也会被强制退出,退出是测试框架进行的操作
这和Java承诺的普通线程不退出程序就不结束是不相符的,如果书上告诉你会输出两个但是你执行了只输出了一个那么很可能就是这里出了问题
而通过main函数则没有框架干预,根据Java的规则只要有普通线程没有退出,程序就不会完全退出(System.exit强制自杀除外),那么除非创建的线程被设置成了后台线程(或者叫守护线程,daemon),那么才会在主线程退出时自动关闭这些后台线程,就是你遇到的偶尔可以输出abcd偶尔不行的效果,否则一定会abcd和efgh两个都输出,只不过输出顺序可能不一致
⑽ java关掉主线程 子线程会关掉吗
不会的,线程设计的初衷就是相互独立运行,互相之间不会影响,如果主线程的关闭影响子线程了,那就违背设计的初衷了