ホームページ >Java >&#&チュートリアル >プロセスとスレッドとは何ですか?
プロセスは比較的独立した実行単位です。
プロセスの一部、つまりプロセス内の実際のタスク実行者は、プロセスにアタッチする必要があります。スレッドのプロセスへの依存は主に次の点に反映されます。
スレッドはプロセスなしでは開始できず、プロセスが開始されるという前提で開始する必要があります。
スレッドはプロセスからデータを取得する必要がある場合があります。
スレッドとプロセスは 2 つの相対的な概念であり、オブジェクトは、それが属する上位実行者の観点からはプロセスと呼ばれます。
4. マルチスレッドの設計目的、用途、意義を独立して実行することはできません。マルチスレッドを使用しても、合計の実行時間を短縮することはできません。
マルチスレッド設計の主な目的は、実行速度を上げることではなく、各スレッドを比較的均等に実行して、特定のスレッドが CPU タイム スライスを長時間保持せず、他のスレッドが長時間占有しないようにすることです。長い間待っています。 CPUのタイムスライスが複数のスレッドを素早く切り替えるため、人間の感覚では感知できる範囲を超え、複数のタスクが実行されているように感じられます。
たとえば、複数の人が同じ Web サイトにアクセスする場合、マルチスレッドが使用されておらず、同時に Web サイトにアクセスできるのは 1 人だけである場合、他のほとんどの人は 5 分かかります。 5 分間待つ必要があります。ユーザー エクスペリエンスは非常に悪いです。これはマルチスレッドを使用し、1 人のユーザーが入力した後、CPU が他のユーザーに切り替わり、他のユーザーが次々に入力できるようになりますが、合計の実行時間は短縮されません。5. CPU スケジューリング モード
プリエンプティブ スケジューリング モード: 各スレッドは CPU タイム スライスをめぐって競合し、CPU タイム スライスはスレッド間で不均等に分散されます。
2 番目のスレッドの作成
Thread クラスを直接継承します。
2. どのメソッドを使用する場合でも、実行する必要があるタスクは run メソッドに配置する必要があります。
まず第一に、リソース共有は Thread を継承してスレッドを作成することによっても実現できることを明確にする必要がありますが、new キーワードによって作成された複数のスレッドは異なります オブジェクト、および共有リソースは、通常はコンストラクター インジェクションを通じて外部からのみ取得できます。
Runnable インターフェースを実装してスレッドを作成すると、同じ実装クラスのオブジェクトを使用して複数のスレッドを作成し、リソースの共有を実現でき、共有リソースはスレッド内から取得されます。
4. Runnable インターフェイスを実装してスレッドを作成すると、唯一の継承の機会が保持されるだけでなく、リソース共有操作が比較的簡単になるため、この方法は通常、スレッドの作成に使用されます。
5. Threadを継承してリソース共有を実現する:
package com.test.thread.extendsThread;public class MyClass {public int count; }Thread thread subclass
package com.test.thread.extendsThread;public class MyThread extends Thread {private MyClass obj;public MyThread() {super(); }public MyThread(MyClass obj) {super();this.obj = obj; } @Overridepublic void run() { System.out.println("obj=" + obj);while (true) {synchronized (obj) {if (obj.count > 0) {try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName() + "----当前数量=" + obj.count--); } elsereturn; } } } }テストクラス
りー
由不同阶段构成的线程从出生到死亡的整个过程,叫做线程的生命周期。
了解线程的生命周期能够更好地掌握线程的运行情况,比如线程的就绪状态,意味着不是调用start方法之后,线程立即执行。
出生状态:线程创建完成,尚未开启前的状态。
就绪状态:调用start方法开启线程,线程尚未运行的状态。
运行状态:线程获取CPU时间片执行时的状态。
休眠状态:线程调用sleep方法后进入指定时长的休眠状态,时间结束进入就绪状态。
等待状态:监听对象在线程内部调用wait方法后,线程失去对象锁,进入等待状态。
阻塞状态:线程发出输入或者输出请求后进入阻塞状态。
死亡状态:run方法执行完毕,线程死亡。
一个线程A在另一个线程B内部调用join方法,B线程中止,A线程开始执行,A线程执行完毕,B线程才开始执行。
线程优先级设定了线程获取CPU时间片的概率,仅仅是一种概率,不能保证优先级高的线程一定优先获得CPU时间片。
线程优先级分为10个等级,从1-10,数值越大,优先级越高,通过setProprity(int)方法设置。
Thread.yield,线程礼让只是通知当前线程可以将资源礼让给其他线程,并不能保证当前线程一定让出资源。
使得同一资源同一时刻只能有一个线程访问的安全机制,即一个线程访问完毕,其他线程才能访问。
由于目标资源同一时刻只有一个线程访问,解决了线程安全问题。
多线程并发访问。
存在可修改的共享数据。
synchronized(共享对象){ 修改共享数据的代码 }
上述操作给修改共享数据的代码加了一把对象锁。任何一个对象只有一把对象锁,线程只有获得了对象锁才能访问加锁的资源。一个线程获取了对象锁,执行加锁的代码,执行完毕,归还对象锁,其他线程开始争夺对象锁,访问资源。
synchronized关键字加到静态方法上时,形成类锁,执行该方法上必须获取类锁。
类锁与对象锁是两种不同的锁,允许一个线程持有类锁,另一个线程持有对象锁。
synchronized关键字加在成员方法,该方法成为同步成员方法,由于一个对象只有一把对象锁,一个线程访问了一个同步成员方法,其他线程不能访问其他同步成员方法。
同步方法不可以被继承,同步方法在子类中失去同步机制。
在同步机制中,如果同步代码的执行需要满足一定条件,那么将判断条件放在锁内,保证当前获取了锁的线程在执行同步代码时满足执行条件。如果放在锁外,有可能出现当前线程获取了锁以后不满足执行条件的情况。
public void run() { System.out.println("obj=" + obj);while (true) {synchronized (obj) {if (obj.count > 0) {try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName() + "----当前数量=" + obj.count--); } elsereturn; } } }
これによりスレッド A が存在します。スレッド B との膠着状態が発生し、プロセス全体が停止します。
2. デッドロックを回避するにはどうすればよいですか?9つのデーモンスレッド
2. メインスレッドはユーザースレッドに属します。
4. デーモンスレッドの作成
5. デーモン スレッドの役割
6. この時点でデーモンスレッドが実行を完了したかどうかに関係なく、すべてのユーザースレッドが実行を完了すると、JVM は終了します。
によって保持されているオブジェクト ロックを解放します。
は、実行メソッドや同期コードを再入力しません。
1.线程局部变量,为每一个线程提供一个变量的副本,使得各个线程相对独立地操作变量,避免线程安全问题。
2.首先必须明确一点,ThreadLocal.get()获取的变量副本必须手动传入:
ThreadLocal.set(Object obj)
初次获取时,判断线程局部变量中是否保存有变量副本,如果没有则手动传入,在该线程中下次获取的就是初次传入的对象。
3.ThreadLocal的目的是保证在一个线程内部,一次创建,多次获取。
4.基本原理:
将初次传入的变量与线程绑定,线程不变,变量不变。
TestRunnable:实现了Runnable接口,run方法中运行的是runTest方法,runTest方法是一个抽象方法。
MultiThreadedTestRunner:负责管理并开启多个线程。
⑴继承TestRunnable,实现其中的抽象方法runTest,将需要运行的代码放入该方法中。通常为子类定义一个有参构造方法,方法形参为需要测试的线程,在runTest方法中调用测试线程的run方法,从而将将需要执行的代码注入runTest方法中。
TestRunnable[] tr=new TestRunnable[len];
MultiThreadedTestRunner mttr=new MultiThreadedTestRunner(tr); mttr.runTestRunnables();
以上がプロセスとスレッドとは何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。