Javaマルチスレッド-ベース(Thread編)


マルチスレッドとは?
         本題に入る前に、まず二つの問題を聞きに来ました。「マルチスレッド」とは何ですか?また、「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
雄弁にまさる事実です。ご参考ください。