1.プロセス
プロセスは、独自のメモリ空間を持って実行単位です。
JVMの各インスタンスは、(のJVMのほとんどのための)プロセスとして実行されます。我々は、交換可能に用語プロセス&アプリケーションを使用しています。
複数のJavaアプリケーションが実行されている場合は、それらのそれぞれは、ヒープの独自のメモリ空間を持っています。&&ヒープは、アプリケーション間で共有されていません。
## 2.スレッド
スレッドは、プロセス内での実行の単位です。
各プロセスは複数のスレッドを持つことができます。
すべてのJavaプロセス(アプリケーション)は、少なくとも1つのスレッド、**メインスレッド**を持っています。
すべてのJavaプロセスは、メモリ管理やI / Oなどのタスクを処理し、複数の**システムスレッド**を持っています。開発者は、明示的にそれらのシステムスレッドを作成し、コードはありません。
私たちのコードは、Javaプログラムによって自動的に作成されたメインスレッド、上、または我々は、明示的に作成し、他のスレッドで実行されます。
3.作成スレッド
スレッドを作成すると、プロセスの作成などなど、多くのリソースを必要としません。
プロセスによって作成されたすべてのスレッドは、プロセスのメモリとファイルを共有します。
4.プロセスメモリ
- 各スレッドは、そのスレッドがアクセスできるメモリである、**スレッドスタックを持っています。
概要
すべてのJavaアプリケーションは、1つのプロセスとして実行され、各プロセスは複数のスレッドを持つことができます。すべてのプロセスは、ヒープがあり、各スレッドは、独自のスレッドスタックを持っています。
4.同時実行
- 一度に複数のことをやってアプリケーションを参照します。実際には、進捗状況は、複数のタスクを行うことができることを意味します。
例。のは、アプリケーションがデータをダウンロードして、画面上の図形を描画したいとしましょう。
それは同時アプリケーションだ場合、それはその後、形状等のより多くの描画に切り替え、その後、いくつかのより多くのデータをダウンロードするに切り替え、その後、形状の一部を描くに切り替え、1ビットのデータをダウンロードすることができます
同時実行は、一つのタスクが他を開始する前に完了させる必要がないことを意味します。
我々は、Javaアプリケーションを同時に作成できるように、Javaは** **スレッド関連のクラスを提供しています。
5.新しいスレッドを作成し、有効にします
、サブクラスのスレッドを作成することにより、過負荷にThreadクラス
public class Main {
public static void main(String[] args) {
System.out.println("Hello from main thread.");
Thread anotherThread = new AnotherThread(); // new 一个新的Thread类,并赋值给Thread对象
anotherThread.start(); // 调用Thread对象的start()方法,启用新线程
System.out.println("Hello again from the main thread.");
}
}
// override Thread Class
public class AnotherThread extends Thread {
@Override
public void run() { // 线程中入口函数是run()
System.out.println("Hello from another thread.");
}
}
B、匿名クラスによって新しいスレッドクラスの開口部
public class Main {
public static void main(String[] args) {
System.out.println("Hello from main thread.");
new Thread() {
System.out.println("Hello from anonymous class.");
}.start(); // 调用Thread类的start()方法,启用线程
System.out.println("Hello again from the main thread.");
}
}
注:ミアンスレッドが他のスレッドを有効にした後、順番彼らは不可知論者の前に行うこと
C、Runnableオブジェクトの建設
import static com.guoqiang.ThreadColor.ANSI_RED;
public class MyRunnable implements Runnable {
// 重载Runnable 类 「implements 和 extends 在override上的差别」
@Override
public void run() {
System.out.println(ANSI_RED + "Hello from MyRunnable's implementation of run()");
}
}
public class Main {
public static void main(String[] args) {
System.out.println(ANSI_PURPLE + "Hello from main thread.");
Thread myRunnableThread = new Thread(new MyRunnable() {
@Override
public void run() {
System.out.println(ANSI_RED + "Hello from anonlymous implementation of run()");;
}
});
myRunnableThread.start();
System.out.println(ANSI_PURPLE + "Hello again from the main thread.");
}
}
サブクラスクラスのVSスレッドのRunnableクラスは、新しいスレッドを作成し、
- 開発者は、一般的に、新しいスレッドを開始するためにRunnableオブジェクトの方法を使用します
- 一般的に言えば、一般的なタスクを実行するための唯一の労働者、設立の独立したクラスは、労働者にRunnableを実装したRunnableクラスのタスクのような労働者、などThreadクラスをすることができます。(デザインコンセプトに関連する)
NOTE: - 唯一のスレッドスタート機能は、スレッドを開始することに注意してください。
6.スレッドのスリープ
スレッドが定期的に休憩を取るように、スレッドのスリープ(ミリ秒)メソッドを呼び出すことによって。
このアプローチは、可能性がある「try / catchブロックで寝るの呼び出しを含んでいなければならない例外:InterruptedException例外をスローします。」
try {
Thread.sleep(3000);
} catch ( InterruptedException e) {
System.out.println("Another thread woke me up");
}