# Native Threads unter Linux?



## Lordimar (12. Apr 2007)

Hi!

Ich habe den Verdacht, dass Sun Java unter Linux keine Native Threads erstellt. Ich bin mir nicht 100%ig sicher, aber etliche Anzeichen sprechen dafür.

Nun habe ich Mal gesucht und nicht viel gefunden. Nach dem Artikel http://java.sun.com/developer/technicalArticles/Programming/linux/index.html habe ich folgendes ausgeführt:

```
$ java -jar /usr/java/jdk1.6.0/demo/jfc/Notepad/Notepad.jar &
[1] 17406

$ ps -eo pid,ppid,command | grep java
 7039  5378 java_vm
17406  6790 java -jar /usr/java/jdk1.6.0/demo/jfc/Notepad/Notepad.jar
17422  6790 grep java
```

Nach dem Artikel sollte es aber eher so lauten:

```
java -jar Notepad.jar
ps -eo pid,ppid,command 

  PID  PPID COMMAND                            
11667 28367 /usr/java/jdk1.3/bin/i386/native_threads/java -jar Notepad.jar
11712 11667 /usr/java/jdk1.3/bin/i386/native_threads/java -jar Notepad.jar   
11713 11712 /usr/java/jdk1.3/bin/i386/native_threads/java -jar Notepad.jar
11714 11712 /usr/java/jdk1.3/bin/i386/native_threads/java -jar Notepad.jar
11715 11712 /usr/java/jdk1.3/bin/i386/native_threads/java -jar Notepad.jar
11716 11712 /usr/java/jdk1.3/bin/i386/native_threads/java -jar Notepad.jar
11717 11712 /usr/java/jdk1.3/bin/i386/native_threads/java -jar Notepad.jar
11718 11712 /usr/java/jdk1.3/bin/i386/native_threads/java -jar Notepad.jar
11722 11712 /usr/java/jdk1.3/bin/i386/native_threads/java -jar Notepad.jar
11723 11712 /usr/java/jdk1.3/bin/i386/native_threads/java -jar Notepad.jar
11724 11712 /usr/java/jdk1.3/bin/i386/native_threads/java -jar Notepad.jar
11726 11712 /usr/java/jdk1.3/bin/i386/native_threads/java -jar Notepad.jar
```

Nun es bezieht sich auf ein älteres Java.

Ich habe auch das hier ausprobiert nach http://documents.wolfram.com/v4/AddOns/JLink/1.1.2.7.html :

```
$ java -native -jar /usr/java/jdk1.6.0/demo/jfc/Notepad/Notepad.jar
Error: native VM not supported

$ export NativeThreads=True

$ java -jar /usr/java/jdk1.6.0/demo/jfc/Notepad/Notepad.jar &

$ ps -eo pid,ppid,command | grep java
 7039  5378 java_vm
17472  6790 java -jar /usr/java/jdk1.6.0/demo/jfc/Notepad/Notepad.jar
17491  6790 grep java
```

Daher stellt sich für mich die Fragen:
* Prüfe ich richtig? Ich denke, dass meine Linux Statements als solches mal stimmen.
* Wie kann man den Native Thread Support aktivieren? Was muss man ggf. installieren?

Grüße


----------



## sparrow (12. Apr 2007)

Lordimar hat gesagt.:
			
		

> * Prüfe ich richtig? Ich denke, dass meine Linux Statements als solches mal stimmen.



Nö 



			
				man ps hat gesagt.:
			
		

> To get info about threads:
> ps -eLf
> ps axms



Du prüfst nur die Prozesse, nicht die Threads.




== Edit ==

Und hier noch ein paar Zusatzinfos:

Dieses Programm hab ich mal geschrieben um genau das zu testen.
It's very simple:


```
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;


public class ThreadTest extends Thread {

        int id;

        /**
         * @param args
         */
        public static void main(String[] args) {
                System.out.println("Thread Test Runnin!");
                System.out.println("Ask ps now to see how a running Thread is displayed");
                System.out.println("Use 'ps -eLf'");
                int i;
                while (true) {
                        BufferedReader br;
                        System.out.println("Enter the number of Threads and press <return>");
                        br = new BufferedReader(new InputStreamReader(System.in));
                        try {
                                String str = br.readLine();
                                i = Integer.parseInt(str);
                                break;
                        } catch (IOException e) {
                                e.printStackTrace();
                        } catch (NumberFormatException e) {
                                System.out.println("Not a number");
                        }

                }
                for (int c = 0; c < i; c++) {
                        System.out.println("Creating and Strating Thread #" + c);
                        ThreadTest thread = new ThreadTest();
                        thread.id = c;
                        thread.start();
                }
        }

        public void run() {
                try {
                        while (true) {
                                System.out.println("Thread: " + this.id + ":" );
                                Thread.sleep(5000);
                        }
                } catch (Exception e) {
                        e.printStackTrace();
                }
        }

}
```

Es tut also nichts weiter als auf die Eingabe der Anzahl der Threads zu warten die es starten soll.
Bevor man die Zahl eingibt zeigt mein Linux folgendes:



			
				Konsole hat gesagt.:
			
		

> sparrow@pluto:~$ ps -eLf | grep java
> sparrow   7020  6077  7020  1    8 21:21 pts/3    00:00:00 java ThreadTest
> sparrow   7020  6077  7021  0    8 21:21 pts/3    00:00:00 java ThreadTest
> sparrow   7020  6077  7022  0    8 21:21 pts/3    00:00:00 java ThreadTest
> ...



Deutlich zu erkennen: 2 Prozesse, insgesamt 9 Threads.
Einer der Prozesse ist der aufruf vor grep dessen Kommando ja "java" enthält.
Der andere Prozess it der des Testprogramms (bzw. der Java virtuellem Maschine). Dieser Prozess hat augenblicklich 8 (native) Threads. Ich nehme mal an die startet die JVM für sich selbst.

Nun lasse ich das Beispielprogramm 10 Threads starten, das Ergebnis:


			
				Konsole hat gesagt.:
			
		

> sparrow@pluto:~/Programming/Java/Projects/JFolderGraph/ka/trunk/JFolderGraph$ ps -eLf | grep java
> sparrow   7056  6077  7056  0   18 21:28 pts/3    00:00:00 java ThreadTest
> sparrow   7056  6077  7057  0   18 21:28 pts/3    00:00:00 java ThreadTest
> sparrow   7056  6077  7058  0   18 21:28 pts/3    00:00:00 java ThreadTest
> ...


Die beiden kekannten Prozesse, aber bei dem Prozess des Java-Programms sind 10 Threads hinzu gekommen.


Gruß
Sparrow


----------



## Lordimar (13. Apr 2007)

Danke! Das war hilfreich.

Jetzt sehe ich das auch.

Grüße


----------

