まず、スレッドとプロセスの違い
システム上で実行されている各プログラムは、プロセスです。各プロセスは、1つ以上のスレッドが含まれています。スレッドは、命令のセット、または独立してプログラムで実行可能なプログラムの特別なセクションの集合です。また、コンテキストのコードの実行として理解することができます。だから、基本的には単一のプログラムで複数のタスクを実行する責任がある軽量プロセススレッド、。オペレーティングシステムによって、複数の実行スレッドをスケジュールするための通常責任と
プログラムの速度を実行している、に対処するために、バックグラウンドタスクにプログラムで長い時間を占めることができるスレッドを使用すると、ユーザーの入力を待っているように、いくつかのタスクの実現に加速する可能性がある、ファイルは読み取りと書き込み、およびネットワークデータを送受信し、スレッドがより有用です。この場合、あなたは、このようなメモリの使用量としてなど、いくつかの貴重なリソースを解放することができます。
オペレーティングシステムがそれらを切り替える必要があるため、多数のスレッドが、パフォーマンスに影響を与えることができれば、より多くのスレッドがより多くのメモリ空間を必要とする、スレッドのサスペンションは、プログラムの実行への影響を考慮する必要があります。典型的には、モデル・データ・ブロックは、複数のスレッド間で共有され、スレッドは、デッドロック状況を回避する必要があります。
要約:プロセスは、すべてのスレッドの組であり、各スレッドは、実行プロセスのパスです。
第二に、なぜ複数のスレッドを使用する必要がありますか?
マルチスレッドは、プログラムの実行効率を向上させます。
以下のような:バッチようにテキストメッセージを送信し、サンダーマルチスレッドのダウンロード、データベース接続プーリング、。
第三に、マルチスレッドモードを作成します
1、Threadクラスの継承は、最初のメソッドの実行を無効に
/**
*
* @classDesc: 功能描述:(创建多线程例子-Thread类 重写run方法)
*/
class CreateThread extends Thread {
// run方法中编写 多线程需要执行的代码
public void run() {
for (inti = 0; i< 10; i++) {
System.out.println("i:" + i);
}
}
}
public class ThreadDemo {
public static void main(String[] args) {
System.out.println("-----多线程创建开始-----");
// 1.创建一个线程
CreateThread createThread = new CreateThread();
// 2.开始执行线程 注意 开启线程不是调用run方法,而是start方法
System.out.println("-----多线程创建启动-----");
createThread.start();
System.out.println("-----多线程创建结束-----");
}
}
図2は、第二は、Runnableインタフェースを実現する実行メソッドをオーバーライドします
/**
*
* @classDesc: 功能描述:(创建多线程例子-Thread类 重写run方法)
*/
class CreateRunnable implements Runnable {
@Override
publicvoid run() {
for (inti = 0; i< 10; i++) {
System.out.println("i:" + i);
}
}
}
/**
*
* @classDesc: 功能描述:(实现Runnable接口,重写run方法)
*/
public class ThreadDemo2 {
public static void main(String[] args) {
System.out.println("-----多线程创建开始-----");
// 1.创建一个线程
CreateRunnable createThread = new CreateRunnable();
// 2.开始执行线程 注意 开启线程不是调用run方法,而是start方法
System.out.println("-----多线程创建启动-----");
Thread thread = new Thread(createThread);
thread.start();
System.out.println("-----多线程创建结束-----");
}
}
図3に示すように、匿名の内部クラスを使用して、第三の実施形態
public class ThreadDemo3 {
public static void main(String[] args) {
Thread thread = new Thread(new Runnable() {
public void run() {
for (int i = 0; i< 10; i++) {
System.out.println("i:" + i);
}
}
});
thread.start();
}
}
第四に、共通API
優れた実装継承Threadクラスや、Runnableインタフェースを使用していますか?
それは良い理由の継承を続けることができるインターフェイスを実装を実現するために、Runnableインタフェースを実装して、クラスは継承できません。
スレッドオブジェクトと名前を取得します。
共通テーマAPIメソッド
スレッドを開始します()開始
currentThread()は、現在のスレッドオブジェクトを取得します
getId()は、この番号は0から始まり、現在のスレッドのIDスレッド番号を取得します。
getName()現在のスレッドの名前を取得します。
スリープ(ロングミル)スリープ中のスレッド
スレッドを停止するには()を停止し、
一般的なスレッドのコンストラクタ
スレッド()新しいThreadオブジェクトを割り当て
スレッド(文字列名)は、その名のように指定された名前を持つ新しいThreadオブジェクトを割り当てます。
スレッド(Runable r)は新しいスレッドオブジェクトを割り当てます
スレッド(Runable R、String name)新しいThreadオブジェクトを割り当てられ、
第五に、デーモンスレッド
Javaは、2件のスレッドがあり、一方が他方のスレッドの守護者である、ユーザスレッドです。
ユーザスレッドは、メインスレッドがユーザスレッドを停止することはありません、停止するように作成したユーザー定義のスレッドを参照します
プロセスが存在するか、メインスレッドを停止しないデーモンスレッドは、スレッド・デーモンが停止されます。
デーモンスレッドを設定するためには、setdaemon(true)メソッドを使用します
thread.setDaemon(真の)
#6は、()メソッドの効果に参加します
メインスレッドは、メインスレッドは、それが実行右T1を与えるべきであることをここでt1.join()メソッドを実行する
`` `のJava
スレッド新しい新しいスレッド= T1(Runnableを新しい新しいです(){
@Override
public void run() {
for (int i = 0; i < 10; i++) {
try {
Thread.sleep(10);
} catch (Exception e) {
}
System.out.println(Thread.currentThread().getName() + "i:" + i);
}
}
});
t1.start();
// 当在主线程当中执行到t1.join()方法时,就认为主线程应该把执行权让给t1
t1.join();
for (int i = 0; i < 10; i++) {
try {
Thread.sleep(10);
} catch (Exception e) {
}
System.out.println("main" + "i:" + i);
}
# 七、优先级 现代操作系统基本采用时分的形式调度运行的线程,线程分配得到的时间片的多少决定了线程使用处理器资源的多少,也对应了线程优先级这个概念。在JAVA线程中,通过一个int priority来控制优先级,范围为1-10,其中10最高,默认值为5。下面是源码(基于1.8)中关于priority的一些量和方法。
Javaの
クラスPrioritytThreadは{Runnableを実装します
public void run() {
for (int i = 0; i < 100; i++) {
System.out.println(Thread.currentThread().toString() + "---i:" + i);
}
}
}
/ **
@classDesc:
* /
publicクラスThreadDemo4 {静的な無効メインパブリック(文字列[]引数){
PrioritytThread prioritytThread新しい新しいPrioritytThread =();
スレッド= T1新しい新しいスレッド(prioritytThread);
スレッドT2 =新しい新しいスレッド(prioritytThread);
t1.start();
//は優先順位が設定されていることに注意してください、毎回が実行されることを意味するものではありません。CPUスケジューリングは、分配制限される
t1.setPriority(10);
t2.start()。}
}
`` `
八、収量方法
役割Thread.yield()メソッドを実行するために現在実行中のスレッドと他のスレッドを一時停止します。(効果がない場合があります)
収率()スレッドは、現在、他のスレッドを実行するために同じ優先順位を取得する機会を持つことができるように、状態を実行するために戻って実行されているように。したがって、収率()の使用目的は、同じ優先度のスレッド間で実行される適切な回転を有することができることです。譲歩のスレッドスケジューラスレッドが再び選択することができるので、しかし、実際には、目的の譲歩を達成するための収量を()保証することはできません。
結論:ほとんどの場合、収量()は、状態から状態への実行中のスレッドを実行するようになりますが、効果がない可能性があります。