ホームページ  >  記事  >  Java  >  Java - プロセスとスレッドの詳細な例

Java - プロセスとスレッドの詳細な例

PHP中文网
PHP中文网オリジナル
2017-06-21 17:04:202048ブラウズ
  • プロセスとスレッド

プロセスはプログラム (タスク) の実行プロセスであり、動的であり、リソース (共有メモリ、共有ファイル) とスレッドを保持し、リソースとスレッドのキャリアです。

スレッドはシステム内の最小の実行単位であり、同じプロセス内に複数のスレッドが存在し、スレッドはプロセスのリソースを共有します。

スレッド対話、対話方法には相互排他と同期が含まれます。

  • スレッドの共通メソッド

Javaのスレッドサポートは主にThreadクラスとRunnableインターフェースに反映されており、それらはすべてjava.langパッケージを継承しており、共通のメソッドrun()を持っています

    スレッドの間違った停止方法: stop()、interrupt()
  • スレッドの正しい停止方法
public class ArmyRunnable implements Runnable {//volatile保证了线程可以正确读取其他线程写入的值volatile boolean keepRunning = true;
    @Overridepublic void run() {while(keepRunning) {//发动五连击for (int i = 0; i < 5 ; i++) {
                System.out.println(Thread.currentThread().getName() + "进攻对方[" + i + "]");
            }//暂停            Thread.yield();
        }
        System.out.println(Thread.currentThread().getName() + "结束了战斗");
    }
}
    競合状態
  • 複数のスレッドが同じデータ(メモリ領域)へのアクセスを共有する場合) 同時に、各スレッドがデータを操作しようとするため、データが破損します。この現象は競合状態と呼ばれます。

    スレッドの相互作用: 相互排他と同期
  • 相互排他: 同時に、1 つのスレッドのみがキー データまたはクリティカル セクションを操作できます。

相互排除の実装: syschronized (固有ロック)、syschronized は、他のスレッドがこの重要な領域に入って重要なリソースにアクセスできないように、コードにロックを追加することと同じです。

同期: あるスレッドの特定の条件が満たされないため、他のスレッドは特定の待機状態になります。その後、あるスレッドが何らかの方法で他のスレッドをウェイクアップします。 。 糸。

同期の実装: wait()/notify()/notifyAll()--Object オブジェクトのメンバーメソッド

Wait set はスレッドの休憩室

public void transfer(int from, int to, double amount) {//通过synchronized 关键字来实现互斥,synchronized既可以出现在方法之上,也能以块的形式出现在方法体之中//通过对lockObj加锁实现互斥//加锁操作是有开销的,多次加锁操作会降低系统的性能synchronized (lockObj) {//while循环,保证条件不满足时任务都会被条件阻挡,而不是继续竞争CPU资源while (energyBoxes[from] < amount) {try {//条件不满足,将当前线程放入锁对象(lockObj)上的wait set//wait set 是线程的休息室                    lockObj.wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            System.out.println(Thread.currentThread().getName());
            energyBoxes[from] -= amount;
            System.out.printf("从%d转移%10.2f单位能量到%d", from, amount, to);
            energyBoxes[to] += amount;
            System.out.printf("能量总和:%10.2f%n",getTotalEnergies());            //唤醒所有在lockObj对象上等待的线程            lockObj.notifyAll();
        }
        
    }
    Runnable 方式でスレッドを作成するのとThread 方式

    Java の単一継承機能により、Runnable メソッドは Thread メソッドによって引き起こされる欠陥を回避できます
  1. Runnable コードは複数のスレッド (Thread インスタンス) で共有でき、複数のスレッドに適しています同じリソースを処理する
  2. 状況

    スレッドのライフサイクル

    Ready: スレッドオブジェクトが作成された後、スレッドのstart()メソッドが呼び出されます(この時点ではスレッドはスレッド キューに入り、取得を待機します。CPU サービスには実行条件がありますが、必ずしも実行を開始する必要はありません。
  1. 実行中: 準備完了状態のスレッドが CPU リソースを取得すると、実行状態になり、run() メソッドのロジックの実行を開始します。
  2. 終了: スレッドの run() メソッドが実行されるか、スレッドが stop() メソッドを呼び出した後 (このメソッドは終了しました)、スレッドは終了状態に入ります。
  3. ブロッキング: 特定の状況下では、実行中のスレッドが何らかの理由で CPU リソースを一時的に放棄し、自身の実行を一時停止し、sleep() メソッドの呼び出しなどのブロッキング状態に入ります
    ユーザー スレッドとデーモンスレッド
    ユーザースレッド: フォアグラウンドで実行され、プログラムのメインスレッド、ネットワークに接続するサブスレッドなどの特定のタスクを実行します
  1. デーモンスレッド: バックグラウンドで実行されます。他のフロントエンド スレッド サービスでは、すべてのユーザー スレッドの実行が終了すると、デーモン スレッドは JVM とともにその作業を終了します。
  2. デーモンスレッドの用途: データベース接続プール内のスレッドの監視、JVM 仮想マシンの起動後のスレッドの監視。最も一般的なデーモン スレッドはガベージ コレクション スレッドです
  3. デーモン スレッドを設定する: Thread クラスの setDaemon(true) メソッドを呼び出して、現在のスレッドをデーモン スレッドとして設定します。注: setDaemon(true) は start() メソッドの前に呼び出す必要があります。そうしないと、デーモン スレッドで生成された新しいスレッドもデーモン スレッドになります。または計算ロジックとして。
    拡張機能
  • Javaメモリモード

ロックと条件

スレッド安全性:原子性と可視性...

マルチスレッドプログラミングで一般的に使用される対話モデル

Java5の同時プログラミングツール

    参考書籍
  • core Java

Java同時実行性の実践

以上がJava - プロセスとスレッドの詳細な例の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。