Javaマルチスレッド-ベース(Thread編)
5378 ワード
マルチスレッドとは?
本題に入る前に、まず二つの問題を聞きに来ました。「マルチスレッド」とは何ですか?また、「Javaマルチスレッド」と「マルチスレッド」は何の連絡がありますか?
はい、問題は簡単に見えるが、抽象的で、答えをはっきりさせたいです。やはり現実に戻って答えを探しましょう。
今は一方通行の4車線の草原高速道路を走っています。60キロ離れたA城に結婚証を作りに行きます。車が多いですが、少なくとも120ヤードのフルスピードで走ることができます。とても快適です。30分もしないうちに高速を降ります。でも、「行ってきました。料金所はどうやって一つですか?」
一時間の移動を経て、二人はついに料金所を通りました。行政センターに行きました。この「合法的な銃の証明書」を受け取るのを心待ちにしています。
はい、この時に上の二つの渋滞状況を緩和させたら、あなたのプランは何ですか?明らかに、いくつかの窓口を開けて同時にサービスしたいですね。プロセスを高速道路の料金所と民政局のロビーに例えれば、有料の口和領収証窓口はスレッドであり、同時に複数のスレッドが一緒に作業している時は、私達が言っている「マルチスレッド」です。
じゃ、「Javaマルチスレッド」は?へへへ、関所を売らないで、Java言語で実現する“マルチスレッド”です!ははは、あっさりしていて、実はこれは意味があって、すべての言語がすべて“マルチスレッド”を支持するのではないため、Javaは少数のいくつかの“マルチスレッド”を支持する言語の1つで、しっかり覚えました!
Javaマルチスレッドの実現
実際には日常生活だけでなく、多くのアプリケーションでもマルチスレッドが普及しています。例えば、Eclipse-はマルチウィンドウ切り替え編集、ブラウザ-マルチタグアクセス、サンダーマルチスレッドダウンロードなどをサポートしています。これらのアプリケーションが全部シングルスレッドの場合、彼らの製品を使う人はいないはずです。
ok、次にJavaのマルチスレッドの長さを見てみましょう。
注:Javaマルチスレッドの実現方法の一つは、統合Thread類であり、他の実現方法がありますか?もちろんです。後にもう一度言ってください。まずThread類を調べます。
運行して、結果を見て、あなたを歩きます。
Main do work 1 Thread[1]do work 2 Main do work 3 Main do work 4 Thread[2]do work 5
走ってきました。焦らないでください。これは一見効果がいいです。よく見てください。これはやはり順番に任務を実行します。一つの料金所の効果と同じです。いわゆる複数のタスクを同時に実行しているわけではありません。本をよく読んでいる学生はもう発見したはずです。問題はrun()の方法にあります。run()はマルチスレッドを書き換える方法ですが、マルチスレッドをアクティブにする方法はstart()です。はい、原因が分かりました。コードを変えましょう。
Main do work 1 Main do work 3 Main do work 4 Thread[2]do work 5 Thread[1]do work 2
なぜwork 2は先に呼び出して、work 5より遅く出力しますか?これはThread.sleepという方法をよく見てください。
OKです。結果として、Mainは順番に自分の1、3、4番のタスクを実行し、2番のタスクをスレッド1に投げ、5番のタスクをスレッド2をなくしました。これで三つのスレッドが一緒に仕事をする効果があります。また、学生が聞きました。私はMainがThreadに任務を投げただけですが、彼らが一緒にするのを見ていませんでした。
OKです。下を見てください。
雄弁にまさる事実です。ご参考ください。
本題に入る前に、まず二つの問題を聞きに来ました。「マルチスレッド」とは何ですか?また、「Javaマルチスレッド」と「マルチスレッド」は何の連絡がありますか?
はい、問題は簡単に見えるが、抽象的で、答えをはっきりさせたいです。やはり現実に戻って答えを探しましょう。
今は一方通行の4車線の草原高速道路を走っています。60キロ離れたA城に結婚証を作りに行きます。車が多いですが、少なくとも120ヤードのフルスピードで走ることができます。とても快適です。30分もしないうちに高速を降ります。でも、「行ってきました。料金所はどうやって一つですか?」
一時間の移動を経て、二人はついに料金所を通りました。行政センターに行きました。この「合法的な銃の証明書」を受け取るのを心待ちにしています。
はい、この時に上の二つの渋滞状況を緩和させたら、あなたのプランは何ですか?明らかに、いくつかの窓口を開けて同時にサービスしたいですね。プロセスを高速道路の料金所と民政局のロビーに例えれば、有料の口和領収証窓口はスレッドであり、同時に複数のスレッドが一緒に作業している時は、私達が言っている「マルチスレッド」です。
じゃ、「Javaマルチスレッド」は?へへへ、関所を売らないで、Java言語で実現する“マルチスレッド”です!ははは、あっさりしていて、実はこれは意味があって、すべての言語がすべて“マルチスレッド”を支持するのではないため、Javaは少数のいくつかの“マルチスレッド”を支持する言語の1つで、しっかり覚えました!
Javaマルチスレッドの実現
実際には日常生活だけでなく、多くのアプリケーションでもマルチスレッドが普及しています。例えば、Eclipse-はマルチウィンドウ切り替え編集、ブラウザ-マルチタグアクセス、サンダーマルチスレッドダウンロードなどをサポートしています。これらのアプリケーションが全部シングルスレッドの場合、彼らの製品を使う人はいないはずです。
ok、次にJavaのマルチスレッドの長さを見てみましょう。
注:Javaマルチスレッドの実現方法の一つは、統合Thread類であり、他の実現方法がありますか?もちろんです。後にもう一度言ってください。まずThread類を調べます。
public class ThreadDemoOne extends Thread {
int no,workno,sleeptime;
public ThreadDemoOne(int no,int workno,int sleeptime) {
// TODO Auto-generated constructor stub
this.no = no;
this.workno = workno;
this.sleeptime = sleeptime;
}
@Override
public void run() {
// TODO Auto-generated method stub
try {
Thread.sleep(sleeptime);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("Thread["+no+"] do work "+workno);
}
public static void main(String[] args) {
System.out.println("Main do work 1");
new ThreadDemoOne(1,2,3000).run();
System.out.println("Main do work 3");
System.out.println("Main do work 4");
new ThreadDemoOne(2,5,1000).run();
}
}
運行して、結果を見て、あなたを歩きます。
Main do work 1 Thread[1]do work 2 Main do work 3 Main do work 4 Thread[2]do work 5
走ってきました。焦らないでください。これは一見効果がいいです。よく見てください。これはやはり順番に任務を実行します。一つの料金所の効果と同じです。いわゆる複数のタスクを同時に実行しているわけではありません。本をよく読んでいる学生はもう発見したはずです。問題はrun()の方法にあります。run()はマルチスレッドを書き換える方法ですが、マルチスレッドをアクティブにする方法はstart()です。はい、原因が分かりました。コードを変えましょう。
public class ThreadDemoOne extends Thread {
int no,workno,sleeptime;
public ThreadDemoOne(int no,int workno,int sleeptime) {
// TODO Auto-generated constructor stub
this.no = no;
this.workno = workno;
this.sleeptime = sleeptime;
}
@Override
public void run() {
// TODO Auto-generated method stub
try {
Thread.sleep(sleeptime);// “sleeptime”
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("Thread["+no+"] do work "+workno);
}
public static void main(String[] args) {
System.out.println("Main do work 1");
new ThreadDemoOne(1,2,3000).start();
System.out.println("Main do work 3");
System.out.println("Main do work 4");
new ThreadDemoOne(2,5,1000).start();
}
}
もう一回実行しますMain do work 1 Main do work 3 Main do work 4 Thread[2]do work 5 Thread[1]do work 2
なぜwork 2は先に呼び出して、work 5より遅く出力しますか?これはThread.sleepという方法をよく見てください。
OKです。結果として、Mainは順番に自分の1、3、4番のタスクを実行し、2番のタスクをスレッド1に投げ、5番のタスクをスレッド2をなくしました。これで三つのスレッドが一緒に仕事をする効果があります。また、学生が聞きました。私はMainがThreadに任務を投げただけですが、彼らが一緒にするのを見ていませんでした。
OKです。下を見てください。
public class ThreadDemoOne extends Thread {
int no,workno,sleeptime;
public ThreadDemoOne(int no,int workno,int sleeptime) {
// TODO Auto-generated constructor stub
this.no = no;
this.workno = workno;
this.sleeptime = sleeptime;
}
@Override
public void run() {
// TODO Auto-generated method stub
try {
for(int i=0;i<5;i++){
System.out.println("Thread["+no+"] do work "+workno+"_"+i);
Thread.sleep(1000);
}
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static void main(String[] args) throws InterruptedException {
System.out.println("Main do work 1");
new ThreadDemoOne(1,2,1000).start();
System.out.println("Main do work 3");
Thread.sleep(1000);
System.out.println("Main do work 4");
new ThreadDemoOne(2,5,1000).start();
Thread.sleep(1000);
System.out.println("Main do work 6");
}
}
Main do work 1 Main dowork 3 Thread[1]dowork 2_0 Thread[1]do work 2_1 Main do work 4 Thread[2]dowork 5_0 Main do work 6 Thread[2]dowork 5_1 Thread[1]do work 2_2 Thread[2]do work 5_2 Thread[1]do work 2_3 Thread[2]do work 5_3 Thread[1]do work 2_4 Thread[2]do work 5_4雄弁にまさる事実です。ご参考ください。