JAVAマルチスレッド作成と終了プロセス
2938 ワード
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()