‘壹’ java main方法结束后,其占用的内存是什么状态
main方法结束后,进程就结束了,操作系统会把进程的内存来回收。
‘贰’ java中可不可以说执行完main方法,java源程序执行完毕了
对
因为main即是起点 也将是终点
除非中间有死循环
因为计算机指令的执行是采用中断机制的
中断后 执行优先级更高的指令
但执行完高优先级指令后最终还是要返回中断点
‘叁’ Java中为用return结束了main方法;但是finally还是会执行入口都关闭了,为什么
Java中finally代码是肯定会被执行的,即使抛出异常或者return。看下面代码:
publicstaticvoidmain(String[]args){
try{
System.out.println("Try");
return;
}finally{
System.out.println("Finally");
}
}
如果查看这段代码的汇编代码:
Code:
0:getstatic#2//Fieldjava/lang/System.out:Ljava/io/PrintStream;
3:ldc#3//StringTry
5:invokevirtual#4//Methodjava/io/PrintStream.println:(Ljava/lang/String;)V
8:getstatic#2//Fieldjava/lang/System.out:Ljava/io/PrintStream;
11:ldc#5//StringFinally
13:invokevirtual#4//Methodjava/io/PrintStream.println:(Ljava/lang/String;)V
16:return
17:astore_1
18:getstatic#2//Fieldjava/lang/System.out:Ljava/io/PrintStream;
21:ldc#5//StringFinally
23:invokevirtual#4//Methodjava/io/PrintStream.println:(Ljava/lang/String;)V
26:aload_1
27:athrow
可以看到编译器编译时已经把finally中的代码(8,11,13)提前到了return之前(16)执行。return之后还会看到finally中的汇编,不过不会执行了。我的理解是编译的时候把return之后的语句拷贝到return之前的位置,但是没有删除return之后的语句。
‘肆’ java是不是从main方法开始到main方法结束
是这样的,但是如果启动了其它线程的话,有可能main方法结束后,程序并没有结束,而是在继续执行其他线程。
‘伍’ Java中的main线程是不是最后一个退出的线程
要实现这个情况,必须知道以下几点
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();
}
}
‘陆’ java main结束后还会执行其他代码吗 为什么求高手指点,要有文字说明,详细一些。
下面的程序输出结果为
0
2
1
当在输出2的时候,main已经结束了。但是程序依然执行,输出了1.
是因为main函数只是程序的入口,是一个程序中多条线程的其中一条。独立的线程间是互相不影响的,因此即便main线程结束了,其他线程依然会照常运行。
class test extends Thread{
@Override
public void run() {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(1);
super.run();
}
}
public class Test{
public static void main(String[] args) {
//new Server();
System.out.println(0);
new test().start();
System.out.println(2);
}
}
‘柒’ 如何确保main方法所在的线程是java程序最后结束的线程如何确保
首先先了解如果在main方法中启动多线程,在其他线程均未执行完成之前,main方法线程会不会提前退出呢?答案是肯定的:
1、JVM会在所有的非守护线程(用户线程)执行完毕后退出;
2、main线程是用户线程;
3、仅有main线程一个用户线程执行完毕,不能决定JVM是否退出,也即是说main线程并不一定是最后一个退出的线程。
所以如果需要确保main方法所在的线程是JVM中最后结束的线程,这里就需要用到Thread类的join()方法:
在一个线程中启动另外一个线程的join方法,当前线程将会挂起,而执行被启动的线程,知道被启动的线程执行完毕后,当前线程才开始执行。
具体实现可参看代码:
classThread1extendsThread
{
publicThread1(StringthreadName)
{
super(threadName);
}
publicvoidrun()
{
System.out.println(getName()+"isrunning");
try
{
sleep(2000);
}
catch(InterruptedExceptione)
{
e.printStackTrace();
}
}
}
classThread2extendsThread
{
privateThread1thread1;
publicThread2(StringthreadName,Thread1thread1)
{
super(threadName);
this.thread1=thread1;
}
publicvoidrun()
{
System.out.println(getName()+"isrunning");
try
{
thread1.start();
thread1.join();
}
catch(InterruptedExceptione)
{
e.printStackTrace();
}
System.out.println("thread2isover");
}
}
publicclassJoinTest
{
publicstaticvoidmain(String[]args)
{
Thread1thread1=newThread1("Thread1");
Thread2thread2=newThread2("Thread2",thread1);
thread2.start();
}
}
在thead2中调用thread1的join()方法,让thread1中断thread2自身的运行,运行程序首先输出thread2isrunning,然后输出thread1isrunning,过了两秒钟之后,才输出thread2isover,这就说明在thread2中调用thread1的join()方法,thread2自身被中断了,转而执行thread1,等待thread1执行完毕之后,再转过来执行thread2。
‘捌’ 如何确保main()方法所在的线程是Java程序最后结束的线程
要实现这个情况,必须知道以下几点
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();
}
}
‘玖’ java.多线程情况下,我的main方法运行结束了,到run方法的代码还没执行结束,会中止吗
main本质上也是属于一个线程,当所有线程都执行完成了JVM才会退出,所以针对你的问题,答案是:
如果main方法运行结束了,但是run没有执行结束,那么main会终止,但是run不会终止。
‘拾’ JAVA中main方法是什么意思
main方法是一个特殊的方法,是程序执行的入口,一个Java程序从main方法开始执行。
Java虚拟机在执行Java程序之前会事先分配一个主线程,然后在主线程里面执行我们这个main方法,明白了吧?所以我们经常说main方法叫主线程!
线程就是一个程序里面不同的执行路径!算了,这些不理解也无所谓,总之,你就记住,Java程序从main方法开始执行,
比如:
public
static
void
main(String[]
args)
{
System.out.println("nihao");
}
在你这里当程序运行的时候,从main方法进来,然后做的第一件事就是System.out.println("nihao");
然后没有其他语句了,main方法执行结束,程序也就执行结束了!