JAVAマルチスレッド作成と終了プロセス


  • Java複数のスレッドは、いつ作成され、いつ終了しますか?
  • javaプログラムの入り口は何ですか?
  • javaメインスレッドmainが終了すると、プログラムは終了しますか?Cの(windows,linux)main関数が実行され、プロセス全体が終了し、サブスレッドも強制的に終了して終了します.これはC/C++とjavaの大きな違いです.C/C++は、通常、サブスレッドが完了してから終了するまでメインスレッドがアクティブに待つ必要があります.Javaはmain関数でサブスレッド(Daemonスレッドではない)の終了を明示的に待つ必要はなく、DestroyJavaVMスレッドを自動的に作成して管理します.

  • JAVAスレッドは2種類あります
     
    Daemonスレッド(デーモンスレッド)とUserスレッド(ユーザスレッド)
     Daemonスレッドは、起動前にsetDaemon(true)で指定できるスレッドです.
     
     
    JAVA仮想マシン起動手順:
    (1)Mainは起動時のメインスレッド,すなわちプログラムエントリである.
    (2)main関数の終了後、仮想機会は自動的に1つのDestroyJavaVMスレッドを起動し、このスレッドはすべてのuser threadスレッドが終了した後に終了するのを待つ(すなわち、daemonスレッドとDestroyJavaVMスレッド自体だけが残って、仮想マシン全体が終了し、このときdaemonスレッドが終了する).したがって、プログラムの終了を望まない場合は、daemon以外のサブスレッドを作成するだけで、スレッドが止まらないsleepでいいです.
     
    スレッドの作成
    Threadクラスには、スレッドを開始するstartメソッドがあります.起動したスレッドは、クラスのrunメソッドを実行します.注:スレッドを起動するときにプロシージャを実行するため、runメソッドを再実装する必要があるのが一般的です.
     
    スレッドの終了
    runモジュール実行完了アクティブ終了、または他のスレッドに強制終了されます.
     
    次のコードは、システムが現在実行しているスレッドの場合、beginとendの間にすべてのスレッドが印刷されていることを示します.
    実装はThreadGroupに基づいて実現される
    印刷されたテスト結果は以下の通りです.(コード添付)Thread-0はmainスレッドが起動したuser threadです.コロンの後ろにスレッド名
    begin.....
    Thead 0:main
    Thead 1:Thread-0
    end.....
    begin.....
    Thead 0:main
    Thead 1:Thread-0
    end.....
    begin.....
    Thead 0:main
    Thead 1:Thread-0
    end.....
    begin.....
    Thead 0:main
    Thead 1:Thread-0
    end.....
    begin.....
    Thead 0:Thread-0
    Thead 1:DestroyJavaVM
    end.....
    begin.....
    Thead 0:Thread-0
    Thead 1:DestroyJavaVM
    end.....
    begin.....
    Thead 0:Thread-0
    Thead 1:DestroyJavaVM
    end.....
     
    テストコード: 
    public class Main {
    	public static void main(String args[]) {
    		new Thread() {
    			public void run() {
    				int i=100;
    				while (i-->0) {
    					try {
    						sleep(10);
    						printAllThreadNames();
    					} catch (InterruptedException e) {
    						e.printStackTrace();
    					}
    				}
    			}
    		}.start();
    		int i = 5;
    		while (i-->0) {
    			try {
    				Thread.sleep(10);
    			} catch (InterruptedException e) {
    				e.printStackTrace();
    			}
    		}
    	}
    
    	public static void printAllThreadNames() {
    		ThreadGroup group = Thread.currentThread().getThreadGroup();
    		ThreadGroup topGroup = group;
    		int estimatedSize = topGroup.activeCount() * 2;
    		Thread[] slackList = new Thread[estimatedSize];
    		int actualSize = topGroup.enumerate(slackList);
    		System.out.println("begin.....");
    		for (int i = 0; i < actualSize; i++) {
    			System.out.println("Thead " + i + ":" + slackList[i].getName());
    		}
    		System.out.println("end.....");
    	}
    }
    

     
     実際、明らかにJAVAが起動する過程もあり、JVMのC言語実現部分にはJNI_がある.OnLoad()