Threadの定義と共通メソッド
Thread についての予備調査
前書き
以前は、誰もがシングルスレッドのプログラムを作成し、メソッドをすべて main 関数で呼び出していたのと同様に、その効率が特に低いことがわかります。 Python. Web サイトにアクセスすると、データ量が多すぎて血を吐きそうになります。今日は Java の同時プログラミングとマルチスレッドの学習について見ていきます
スレッドの作成方法はたくさんあります。スレッド Thread クラスの継承や Runnable インターフェースの実装などのメソッド...作成されたメソッドを詳しく見てみましょう
Thread の継承
Thread
を継承すると を直接呼び出せる理由> start()
メソッドはスレッドを開始します。start()
自体は Thread のメソッドであるため、つまり Thread の start() メソッドを継承しているため、このクラスのオブジェクトはstart() を呼び出すことができます スレッドを開始します
//继承Threadpublic class MyThread extends Thread { public void run() {for (int i = 0; i < 10; i++) { System.out.println(this.getName()+"正在跑"); } } }public class Test{public static void main(String[] args) { Mythread t1=new MyThread(); //创建对象t1.start(); //启动线程} }ログイン後にコピーThread
可以直接调用start()
方法启动线程呢,因为start()
本身就是Thread的方法,也就是继承了Thread的start()方法,因此这个类的对象可以调用start()启动线程
//实现Runnable接口public class Demo implements Runnable { @Overridepublic void run() {for(int i=0;i<10;i++) { System.out.println(Thread.currentThread().getName()+"正在跑"); } } }//测试类public class Test{public static void main(String[] args) { Demo d=new Demo(); //创建对象Thread thread1=new Thread(d); //为对象创建一个线程Thread thread2=new Thread(d); //创建另外一个线程//同时启动两个线程thread1.start(); thread2.start(); } }
注意: 继承
Thread
类的创建方法一个对象只能创建一个线程,并不能多个线程共用一个对象,只能一个线程对应一个对象,因此我们来看看实现Runnable
接口的类来实现多个线程共享同一个对象
实现Runnable接口
//普通的一个类public class Simple {public void display() {for(int i=0;i<10;i++) { System.out.println(Thread.currentThread().getName()+"正在跑"); } } }//线程测试类public class Test {public static void main(String[] args) { //如果在外面必须使用final,当然也可以直写在run方法中,不过写在外面可以实现多个线程共享一个对象//写在run方法中当前对象只能为一个线程使用,和继承Thread类一样的效果final Simple simple=new Simple(); //下面创建使用同一个对象创建同两个线程,实现多个线程共享一个对象,和实现Runnable接口一样的效果Thread t1=new Thread(){public void run() { simple.display(); }; }; Thread t2=new Thread(){public void run() { simple.display(); }; }; //启动这两个线程t1.start(); t2.start(); }}
从上面可以清楚的看到实现
Runnable
接口的类一个对象可以供多个线程共享,并不像继承Thread类只为一个线程使用
简便的创建方法
直接在
main
方法中创建,如果创建的普通类的对象在外面,那么必须是final修饰,可以实现多个线程同时共享一个对象,这个和实现Runnable
接口一样,这时候就要控制同步条件了,如果在run方法中定义对象,那么,就是一个线程对应一个对象,这个就和继承Thread类一样的效果。所以可以根据条件自由选择
//线程的类,继承Threadpublic class MyThread1 extends Thread {public void run() { // 重载run方法,并且在其中写线程执行的代码块for (int i = 0; i < 10; i++) {// 获取线程的id和nameSystem.out.println("Thread-Name: " + this.getName() + " Thread-id: " + this.getId());try {this.sleep(1000); // 线程休眠1秒} catch (InterruptedException e) { e.printStackTrace(); } } } }//线程测试的类public class Test {public static void main(String[] args) { MyThread1 t1 = new MyThread1(); // 创建线程t1.setName("第一个线程"); // 设置线程的名字MyThread1 t2 = new MyThread1(); t2.setName("第二个线程"); t1.start(); // 启动线程,开始运行t2.start(); } }
常用的方法
static void sleep(long mils)
使正在运行的线程休眠mils毫秒,但是这里需要注意的是如果线程加了锁,那么使线程休眠并不会释放锁
String getName()
得到线程的名称,上面的程序中已经使用了这个方法
void setName(String name)
设置正在运行的线程的名字为name
start()
启动线程,线程的创建并不意味着线程的启动,只有调用start()方法线程才是真正的开始运行
long getId()
返回线程的标识符
run()
线程执行的代码都放在run()方法中,在run方法中的调用是有序的,都是按照程序运行的顺序开始执行
使用
下面使用上面的方法创建一个实例
//线程类public class MyThread1 extends Thread {public void run() { // 重载run方法,并且在其中写线程执行的代码块for (int i = 0; i < 10; i++) {// 获取线程的id和nameSystem.out.println("Thread-Name: " + this.getName() + " Thread-id: " + this.getId());try {this.sleep(1000); // 线程休眠1秒} catch (InterruptedException e) { e.printStackTrace(); } } } }//测试类public class Test {public static void main(String[] args) { MyThread1 t1 = new MyThread1(); // 创建线程t1.setName("第一个线程"); // 设置线程的名字t1.start(); // 启动线程,开始运行try { t1.join(); //阻塞其他线程,只有当这个线程运行完之后才开始运行其他的线程} catch (InterruptedException e) { e.printStackTrace(); }for (int i = 0; i < 10; i++) { System.out.println("主线程正在运行"); } } }//输出结果/*Thread-Name: 第一个线程 Thread-id: 9Thread-Name: 第一个线程 Thread-id: 9Thread-Name: 第一个线程 Thread-id: 9Thread-Name: 第一个线程 Thread-id: 9Thread-Name: 第一个线程 Thread-id: 9Thread-Name: 第一个线程 Thread-id: 9Thread-Name: 第一个线程 Thread-id: 9Thread-Name: 第一个线程 Thread-id: 9Thread-Name: 第一个线程 Thread-id: 9Thread-Name: 第一个线程 Thread-id: 9主线程正在运行主线程正在运行主线程正在运行主线程正在运行主线程正在运行主线程正在运行主线程正在运行主线程正在运行主线程正在运行主线程正在运行 */
void join()
等待该线程终止才能运行其他的线程
void join(long mils)
等待该线程的时间为mils毫秒,一旦过了这个时间其他线程正常执行
使用
//线程类public class MyThread1 extends Thread {public void run() { // 重载run方法,并且在其中写线程执行的代码块for (int i = 0; i < 10; i++) {// 获取线程的id和nameSystem.out.println("Thread-Name: " + this.getName() + " Thread-id: " + this.getId());try {this.sleep(1000); // 线程休眠1秒} catch (InterruptedException e) { e.printStackTrace(); } } } }//测试类public class Test {public static void main(String[] args) { MyThread1 t1 = new MyThread1(); // 创建线程t1.setName("第一个线程"); // 设置线程的名字MyThread1 t2 = new MyThread1(); t2.setName("第二个线程"); t2.setPriority(8); //设置第二个线程的优先级为8,第一个线程的优先级为5(是默认的)t1.start(); t2.start(); } }/* * 从上面的运行结果可以看出大部分的第二个线程都是在第一个线程之前开始执行的,也就是说优先级越高获得cpu执行的几率就越大 * /
getPriority()
得到当前线程优先级
setPriority(int num)
更改线程的优先级(0-10)默认的是5,优先级越高获得cpu资源的几率就会越高
使用
//测试类public class MyThread1 extends Thread {public void run() { // 重载run方法,并且在其中写线程执行的代码块for (int i = 0; i < 10; i++) {// 获取线程的id和nameSystem.out.println("Thread-Name: " + this.getName() + " Thread-id: " + this.getId());try { Thread.sleep(1000); //休眠一秒,方便主线程运行结束} catch (InterruptedException e) { e.printStackTrace(); } } } }public class Test {public static void main(String[] args) { MyThread1 t1 = new MyThread1(); // 创建线程t1.setName("第一个线程"); // 设置线程的名字t1.setDaemon(true); t1.start();for (int i = 0; i < 1; i++) { System.out.println(i); } } }//结果:/* 0123456789Thread-Name: 第一个线程 Thread-id: 9*//* * 从上面的结果可以看出,一旦主线程结束,那么守护线程就会自动的结束 *
setDaemon(boolean)
是否设置为守护线程,如果设置为守护线程,那么主线程销毁守护线程也会随之销毁- 注:
isDaemon()
Thread
クラスの作成メソッドを継承します。オブジェクトは 1 つのスレッドと複数のスレッドのみを作成できます。 1 つのオブジェクトを共有することはできません。1 つのスレッドが 1 つのオブジェクトに対応するため、複数のスレッドが同じオブジェクトを共有できるようにするRunnable
インターフェースを実装するクラスを見てみましょう
Runnable インターフェースを実装します
上記から明らかなように、Runnable
インターフェイスを実装するクラスのオブジェクトは、1 つのスレッドでのみ使用される Thread クラスの継承とは異なり、複数のスレッドで共有できます
main
メソッド内で直接作成します。作成した通常のクラス オブジェクトが外部にある場合は、複数のスレッドで同時にオブジェクトを共有する必要があります。このとき、同期条件を制御するために、runメソッド内でオブジェクトを定義すると、1つのスレッドが1つのオブジェクトに対応し、Threadクラスを継承するのと同じ効果になります。条件に応じて自由に選択できます🎜🎜🎜rrreee🎜🎜よく使われる方法🎜🎜- 🎜
static void sleep(long mils)
スレッドはミリ秒間スリープしますが、ここで注意する必要があるのは、スレッドがロックされている場合、スリープしてもロックは解放されないということです🎜🎜🎜🎜🎜- 🎜
String getName()
このメソッドは上記のプログラムで使用されています🎜🎜🎜🎜🎜- 🎜
- 🎜
start ()
スレッドを開始します。スレッドの作成は、start() メソッドが呼び出された場合にのみ、スレッドの開始を意味します。🎜🎜🎜🎜🎜- 🎜
long getId ()
スレッドの識別子を返します 🎜🎜🎜🎜🎜- 🎜
run()
スレッドによって実行されるコードは run() メソッドに配置され、run メソッド内の呼び出しは順番に行われ、すべてプログラムの実行順序で実行されます。インスタンスを作成するメソッド: class=" list-paddingleft-2"> - 🎜
void join()
他のスレッドを実行する前にスレッドが終了するのを待ちます🎜🎜 - 🎜
void join(long mils)
このスレッドの待機時間は mils ミリ秒です。この時間が経過すると、他のスレッドは 🎜🎜rrreee🎜🎜- 🎜
getPriority()
現在のスレッドの優先度を取得します🎜🎜 - 🎜
setPriority(int num)
スレッドの優先度を変更します (0- 10) デフォルトは 5 で、優先度が高くなります。CPU リソースを取得する可能性が高くなります🎜🎜🎜🎜🎜Use🎜🎜rrreee🎜🎜- 🎜
setDaemon (boolean)
デーモン スレッドに設定されていますか。デーモン スレッドとして設定されている場合、デーモン スレッドが破棄されるとメイン スレッドも破棄されます🎜🎜 - 🎜
isDaemon() code> デーモンスレッドかどうかを判断するには🎜🎜🎜🎜🎜use🎜🎜rrreee 🎜🎜🎜🎜
- 🎜
- 🎜
- 🎜
- 🎜
void setName( String name)
実行中のスレッドの名前を name に設定します🎜🎜🎜🎜🎜 - 🎜
- 🎜
以上がThreadの定義と共通メソッドの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック











Java クローラーに関する予備調査: その基本的な概念と使用法を理解するには、具体的なコード例が必要です インターネットの急速な発展に伴い、企業や個人にとって大量のデータの取得と処理は不可欠なタスクとなっています。クローラー(WebScraping)は自動データ取得手段として、インターネット上のデータを迅速に収集できるだけでなく、大量のデータを分析・処理することができます。クローラーは、多くのデータ マイニングおよび情報検索プロジェクトにおいて非常に重要なツールとなっています。この記事では、Java クローラーの基本的な概要を紹介します。

Java でマルチスレッドを実装するには 2 つの方法があり、1 つは Thread クラスを継承する方法、もう 1 つは Runnable インターフェイスを実装する方法で、Thread クラスは java.lang パッケージで定義されます。クラスが Thread クラスを継承し、このクラスの run() メソッドをオーバーライドする限り、マルチスレッド操作を実装できますが、クラスが継承できる親クラスは 1 つだけであり、これがこのメソッドの制限です。例を見てみましょう: packageorg.thread.demo;classMyThreadextendsThread{privateStringname;publicMyThread(Stringname){super();this

新しいスレッドを開始するには、Java の Thread.start() 関数を使用します。Java では、マルチスレッドを使用して複数のタスクを同時に実行できます。 Java は、スレッドを作成および管理するための Thread クラスを提供します。 Thread クラスの start() 関数は、新しいスレッドを開始し、スレッドの run() メソッド内のコードを実行するために使用されます。コード例: publicclassMyThreadextendsThread{@Overr

Java では、スレッドに関して言えば、Thread が不可欠です。スレッドは、プロセスよりも軽量なスケジュールされた実行プログラムです。なぜスレッドを使用するのでしょうか?スレッドを使用すると、オペレーティング システム プロセスでのリソース割り当てと実行スケジュールを分離できます。各スレッドはプロセス リソース (メモリ アドレス、ファイル I/O など) を共有できるだけでなく、独立してスケジュールすることもできます (スレッドは CPU スケジューリングの基本単位です)。注 1. Thread はスレッドを作成するための最も重要なクラスであり、単語自体もスレッドを表します。 2. Thread クラスは Runnable インターフェイスを実装します。インスタンス publicclassThreadDemoextendsThread{publicvoidrun(){for(inti=0)

一部のユーザーは、Microsoft の 3 月の Win11 アップデート パッチ KB5035853 をインストールした後、ブルー スクリーン オブ デス エラーが発生し、システム ページに「ThreadStuckinDeviceDriver」が表示されたと報告しました。このエラーはハードウェアまたはドライバーの問題によって発生する可能性があることが理解されています。ここでは、コンピューターのブルー スクリーンの問題をすぐに解決できる 5 つの修正方法を紹介します。方法 1: システム ファイル チェックを実行する コマンド プロンプトで [sfc/scannow] コマンドを実行すると、システム ファイルの整合性の問題を検出して修復できます。このコマンドの目的は、欠落または破損したシステム ファイルをスキャンして修復し、システムの安定性と通常の動作を確保することです。方法 2: 1. 「ブルー スクリーン修復ツール」をダウンロードして開きます。

SpringMVC について: このフレームワークの本質を予備的に調べるには、特定のコード例が必要です。 はじめに: SpringMVC は、Java ベースの Web アプリケーション開発フレームワークです。MVC (Model-View-Controller) 設計パターンを採用し、柔軟でスケーラブルな方法を提供します。 Web アプリケーションを構築します。この記事では、SpringMVC フレームワークの基本的な動作原理とコア コンポーネントを紹介し、実際のコード例と組み合わせて、読者がこのフレームワークの性質をよりよく理解できるようにします。

iPhone15ProとiPhone15ProMaxはThreadメッシュネットワークプロトコルをサポートしています。スレッド ネットワーキング テクノロジーは Pro モデルの新機能としてリストされていますが、iPhone 15 および iPhone 15 Plus には含まれていません。 Appleによると、iPhone 15 ProはThreadラジオを搭載した初のスマートフォンであり、Threadをサポートするスマートホーム製品を直接制御するために使用できるという。 Thread は以前にも HomePod mini と Apple TV に追加されましたが、他の Apple デバイスには Thread 接続がありません。 iPhone 15 Pro モデルのプレスリリースで、Apple は Thread が「ホーム」であると説明しました。

Java では、Thread クラスの start() 関数を使用して新しいスレッドを開始します。Java におけるマルチスレッドは、複数のタスクを同時に実行できる同時実行方法です。マルチスレッドを実装するために、Java には Thread クラスが用意されており、これを通じてスレッドが作成および制御されます。このうち、start() 関数は新しいスレッドを開始するために使用されます。 start() 関数の機能は、スレッドを準備完了状態にし、スレッドの run() メソッドを自動的に呼び出すことです。スレッドが start( を呼び出すとき
