JAvaマルチスレッド基礎編一

4580 ワード

以前はJavaマルチスレッドの知識をあまり応用したことがなく、マルチスレッドについては簡単に理解していたので、この知識はあいまいでした.
今はだめです.マルチスレッドの応用が多いプロジェクトに触れたので、この知識点をシステムに出して勉強することにしました.この文章では、マルチスレッドの基礎に関する知識を紹介するつもりですが、誤解があれば、ご指摘を惜しまないでください.
一、概説
1、プロセスとスレッドの違い
プロセスとは、1つのメモリで実行されるアプリケーションで、各プロセスには独立したメモリ領域があり、1つのプロセスには1つ以上のスレッドが含まれています.
各スレッドには彼の所属するプロセスがあり、各スレッドはそのプロセスの実行経路であり、スレッド間は高周波で急速に交代して実行され、「同時」実行は人に感じさせるだけである.
2、Java中のスレッドは一般的に5中の状態がある
≪ステータスの作成|Create Status|emdw≫:スレッド・オブジェクトを生成します.オブジェクトのstartメソッドは呼び出されません.これは、スレッドが作成されている状態です.
      準備状態:スレッドのstartメソッドが呼び出されるとスレッドは準備状態に入り、startメソッドが呼び出されるとスレッドは直ちに実行されるのではなく、キューに並んで実行を待つだけで、具体的にいつ実行されるかはCPUの気持ち次第で、スレッドが待機またはスリープ状態から帰ってきた後も準備状態に入る.
      実行状態:run()関数のコードの実行を開始します.これが実行状態です.
      ブロック状態:スレッドが実行中に一時停止されるとブロック状態に入り、sleep、suspend、waitはスレッドをブロック状態にすることができます.
      死亡状態:run()メソッドの実行が終了したり、スレッドのstopメソッドが呼び出されたりすると、そのスレッドは死亡し、すでに死亡しているスレッドに対してstartメソッドを使用して準備状態に入ることはできません.
1.Runnableインタフェースを実現するにはrun()メソッドを書き換える必要があり、スレッドのオープンはnewThread.start()を使用する.
package chc.runnable;

public class ThreadTest1 {
	public static void main(String[] args) {
		Runnable1 r =new Runnable1();
		Thread t1=new Thread(r);
		t1.start();
	}
}

class Runnable1  implements Runnable {

	public void run() {
		// TODO Auto-generated method stub
		for (int i = 1; i <= 5; i++) {
			System.out.println("  Runnable     ----->"+i);
		}
	}

}

2、Threadクラスを継承する
package chc.runnable;

public class ThreadTest2 {
    public static void main(String[] args) throws InterruptedException {
        Thread1 t = new Thread1();
        //t.run(); //           
        t.start();
        for (int i = 0; i < 100; i++) {
            System.out.println("main:"+i);
        }
    }
}

class Thread1 extends Thread{
    public void run() {
        for (int i = 0; i < 100; i++) {
            System.out.println("Thread-----:"+i);
        }
    }
}
実際にAPIを参照すると、ThreadクラスはRunnableインタフェースを実装していることがわかります.
三、run()とstartの違い1、run()メソッドはRunnableオブジェクトの一般的なメソッドにすぎず、このメソッドにはスレッドタスクのコードが格納されているだけです.
スレッドオブジェクトを直接呼び出すrun()メソッドは、スレッドのrun()メソッド内のコードを1回実行しただけで、新しいスレッドを有効にしていません.start()メソッドは、新しいスレッドが準備完了状態に入り、スレッドキューにスレッドを追加することです.
2、run()は普通の方法で、もちろん何度も呼び出すことができますが、start()は一度だけ呼び出すことができます.
3、run()は一般的な方法で、順次実行する必要があり、実行が完了してから次のコードを実行することができ、startはスレッドを準備状態にしてメインスレッドや他のスレッドと同時実行することができる.
くどくど言うのは実はすべてそのような1つの意味で、実際に自分で例を書いて何でも理解しました:
package chc.runnable;

public class ThreadTest {
    
    /**
     *       run()  start()          
     * @author HaiCheng
     * @param args
     * @throws Exception
     */
    public static void main(String[] args){
    	Thread r=new ThreadDemo("    run  ");
    	r.run();
        Thread t1=new ThreadDemo("   ");
        t1.start();
        Thread t2=new ThreadDemo("   ");
        t2.start();
        for(int i=0;i<100;i++){
        	System.out.println("     ------>"+i);
        }
    }
    
    public static class ThreadDemo extends Thread{
    	private String ThreadName;
    	public ThreadDemo(String s){
    		this.ThreadName=s;
    	}
        @Override
        public void run() {
            for (int i = 0; i < 100; i++) {
                System.out.println(this.getThreadName()+"  ------>"+i);
            }
        }
		public String getThreadName() {
			return ThreadName;
		}
    }
}

実行結果が長いので貼らない.
四、スレッドの常用方法
1、sleep()   指定したミリ秒以内に現在実行中のスレッドをスリープ状態(ブロック状態)にし、スリープ状態が終了すると準備完了状態にします.
例:
package chc.runnable;
import java.util.Date;
/**
 * sleep()                     (    )。
 * @author HaiCheng
 *
 */
public class SleepTest {
    public static void main(String[] args) {
        Thread2 t = new Thread2();
        t.start();
        try {
            Thread.sleep(10000); //     10  
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        //     10     t       
        //t.interrupt(); //          ,  t                   run               ,         
        //t.stop();        ,     interrupt()   
        t.flag = false;
    }
}
class Thread5 extends Thread{
    boolean flag = true; //            ,       run          ,    run           
    @Override
    public void run() { //run     ,        
        while(flag){
            System.out.println("---"+new Date()+"---");
            try {
                sleep(1000);
            } catch (InterruptedException e) {
                return;
            }
        }
    }
}

未完待機