Javaスレッドの詳しい説明とスレッドとプロセスの違い

高洛峰
リリース: 2017-01-19 11:25:46
オリジナル
1513 人が閲覧しました

java スレッドの詳しい説明とスレッドとプロセスの違い

1.プロセスとスレッド

各プロセスは独自のメモリ空間を持ち、1つのアプリケーションは同時に複数のプロセスを起動できます。たとえば、IE ブラウザの場合、IE ブラウザを開くことはプロセスを開始することと同じです。

スレッドは、プロセス内の実行フローを指します。プロセスには複数のスレッドを含めることができます。

各プロセスは、オペレーティング システムが独立したメモリ領域を割り当てる必要があり、同じプロセス内の複数のスレッドがこの領域、つまり共有メモリやその他のリソースを共有します。

java.exe が呼び出されるたびに、オペレーティング システムは Java 仮想マシン プロセスを開始します。Java 仮想マシン プロセスが開始されると、Java 仮想マシンはメイン スレッドを作成し、プログラム エントリの main メソッドから実行を開始します。 。

Java 仮想マシンはスレッドを開始するたびに、関連情報 (ローカル変数など) を保存するためにスレッド メソッド スタックをスレッドに割り当て、スレッドはこのスタック上で実行されます。したがって、Java オブジェクトのローカル変数はスレッドセーフですが、インスタンス変数とクラス変数はスタックに保存されないため、スレッドセーフではありません。

プロセスには、準備完了、実行中、ブロックという 3 つの状態があります。

Javaスレッドの詳しい説明とスレッドとプロセスの違い

2. スレッド作成メソッド

実行可能なメソッド: (このメソッドは柔軟であり、推奨されます)

public class Thread02 implements Runnable {
  
  public static void main(String[] args) {
    Runnable r = new <strong>Thread02</strong>();
    Thread t1 = new Thread(<strong>r</strong>, "t1");
    /**
     *   Thread源码
     *   public Thread(Runnable target, String name) {
          init(null, target, name, 0);
             }
     */
    Thread t2 = new Thread(r, "t2");
    t1.start(); // 启动线程t1,处于就绪状态,等待cpu
    t2.start(); // 启动线程t2,处于就绪状态,等待cpu
    t1.run(); // 主线程main调用对象t1的run方法
  }
  
  public void run() {
    System.out.println("thread&#39;s name is "
        + Thread.currentThread().getName());
  }
  
}
ログイン後にコピー

実行結果は次のようになります:

thread&#39;s name is t1
thread&#39;s name is main
thread&#39;s name is t2
ログイン後にコピー

Thead メソッド

public class Thread03 extends Thread {
  
  public static void main(String[] args) {
    Thread03 t1 = new <strong>Thread03</strong>();   //不注意的情况下写成了Thread t1=new Thread()  注:Thread03此时就是一个线程了
    t1.start();
  }
  
  public void run() {
    System.out.println("thread&#39;s name is "
        + Thread.currentThread().getName());
  }
}
ログイン後にコピー

実行結果:thread の名前は Thread-0 です

注: カスタム スレッドに加えて、プログラムが実行されるたびにメイン スレッドも存在します。

総合:

public class Thread01 {
  public static void main(String[] args) {
 
    Thread thread=new Thread();
    thread.start();//真正起作用 的是run()
    /**而Thread中的run
     * public void run() {
      if (target != null) {
        target.run();
      }
      }
      所以自己创建的线程要重写run方法,把要执行的内容放到run()中,所以要实现接口或继承进而产生子类
     */
     
    //创建线程的方式1 thread子类方式(继承)
    Thread thread1=new Thread(){
      public void run() {
        while(true){
          try {
            Thread.sleep(500);//休息500毫秒
          } catch (InterruptedException e) {
            e.printStackTrace();
          }
          //Thread.currentThread()得到当前线程
          System.out.println("线程1的名字是 "+Thread.currentThread().getName());
        }
      }
    };
//    thread1.start(); //不写  线程无法启动
     
     
    //创建线程的方式2 runnable方式(实现) 推荐使用
    Thread thread2=new Thread(new Runnable(){
 
      public void run() {
 
        while(true){
          try {
            Thread.sleep(300);
          } catch (InterruptedException e) {
            e.printStackTrace();
          }
          System.out.println("thread2&#39;name is "+Thread.currentThread().getName());
           
        }
      }});
//    thread2.start();
     
    //执行的是thread
    new Thread(new Runnable(){
      public void run() {
        System.out.println("runnable "+Thread.currentThread().getName());
      }}){
      public void run() { //子类中的run方法覆盖父类中的run方法,这样就不会执行runnable
        System.out.println("thread "+Thread.currentThread().getName());
      }
    }.start();
  }
  /***
   * 在单个cpu中执行多线程很有可能降低执行效率而不是提高 一个人在不同地方做同一件事情
   */
}
ログイン後にコピー

読んでいただきありがとうございます、皆さんのお役に立てれば幸いです、このサイトをサポートしていただきありがとうございます!

Java スレッドの詳細な説明と、スレッドとプロセスの違いに関する関連記事については、PHP 中国語 Web サイトに注目してください。


関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート