折り紙の不帰路(20)

32212 ワード

一.スレッド
プロセス:プログラムがコンピュータ上でリソースのスケジューリングと割り当てを行う最小ユニットスレッド:1つのプロセスは少なくとも1つのスレッドを起動し、このスレッドはメインスレッドと呼ばれ、スレッドはプログラム内部でリソースのスケジューリングを行う最小ユニットマルチスレッドである:
一.スレッド3要素
CPU:そのプログラムはCPUの実行権を奪い取って、どのプログラムはコードを実行し始めます:スレッド実行体、メインスレッド以外のスレッドは何をする必要がありますデータ:マクロ:プログラムの中でインタラクティブなすべての変数のミクロ:変数の中で保存するデータはどうしてマルチスレッド1を学ぶのですか.いくつかの時間のかかる操作を解決する.いくつかのビジネスロジックの同時操作を解決
二.Javaのマルチスレッド:
マルチスレッドは符号化レベルのマルチスレッドであり、比較的簡単なjavaである.lang.Thread javaでスレッドを開くとThreadオブジェクトjavaプログラムのmainメソッドがメインスレッドになります
マルチスレッドを作成する2つの方法
1.Threadクラスの継承
インスタンス変数は互いに影響しない静的変数であり、影響を及ぼす可能性があります.
関連コード実装
package day18;
/**
 *   Thread
 * @author Acer
 *
 */
public class FirstThread extends Thread{
     
	private int i;
	//  run  
	@Override
	public void run() {
     
		//     
		//        ,   run      
		for(;i<100;i++) {
     
			//    i        
			System.out.println(this.getName()+" "+i);
			try {
     
				sleep(00);
			} catch (InterruptedException e) {
     
				// TODO Auto-generated catch block
				e.printStackTrace();
			}//    1  ,            1 
		}
	}
	
	public static void main(String[] args) {
     
		// main         
		for(int i=0;i<100;i++) {
     
			Thread mt = Thread.currentThread();
			System.out.println(mt.getName()+" "+i);
			// i  20   ,      
			if(i==20) {
     
				Thread t1 = new FirstThread();//Thread-0
				Thread t2 = new FirstThread();//Thread-1
//			    ,  start  
			t1.start();
			t2.start();
			}
			
		}
	}
}


2.Runnableインタフェースの実装
Runnableインタフェースの実装クラスにはstartメソッドがないため、スレッド作成をThreadに依存する必要があります.つまり、javaではThreadのインスタンスのみがスレッドインスタンス変数を表します.1つのRunnableの実装クラスインスタンスを入力すると、2つの異なるRunnableの実装クラスインスタンスを入力すると、静的変数に影響を与えません.
package day18;

/**
 *   Runnable  
 * 
 * @author Acer
 *
 */
public class SecondThread implements Runnable {
     
	private int i;


	@Override
	public void run() {
     
		for (; i < 100; i++) {
     
			System.out.println(Thread.currentThread().getName() + "id " +Thread.currentThread().getId()+"    "+Thread.currentThread().getPriority()+"   "+i);
			try {
     
				Thread.sleep(100);
			} catch (InterruptedException e) {
     
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}

	}

	public static void main(String[] args) {
     
		for (int i = 0; i < 100; i++) {
     
			Thread mt = Thread.currentThread();
			System.out.println(mt.getName() + "id " + mt.getId() + "    " + mt.getPriority() + "   " + i);
			if (i == 10) {
     
				SecondThread st1 = new SecondThread();
				SecondThread st2 = new SecondThread();
				//   st1 st2   start  
				//      Runna           Thread
				Thread t1 = new Thread(st1,"   ");
				Thread t2 = new Thread(st2,"   ");
				t1.start();
				t2.start();
			}
		}
	}
}


スレッドのライフサイクル
1.新規状態(New)ThreadインスタンスThread t=new Thread()を作成する.2.準備状態(Runnable)実行t.startはスレッドを代表してCPUの奪取を開始する準備ができている3.運転状態(Running)run()メソッドのコードブロック4を実行する.ブロック状態(Blocked)a.sleepのスリープ時間が他のスレッドによって中断され他のスレッドが加わるとブロック状態を終了する準備状態b.joinの現在のスレッドのブロックに移行し、joinを呼び出すスレッドによって先に実行され、実行が完了すると現在のスレッドは準備状態5に入る.デッドステート(Dead)はスレッド全体の実行が完了し、このスレッドを開くことができないと異常を報告し、不正なスレッドステータスのデッドステートのコード実装
package day18;

public class DeadThread extends Thread {
     
	int i = 0;

	@Override
	public void run() {
     
		for (; i < 100; i++)
			//        
			System.out.println(getName() + " " + i+" "+isAlive());
	}
	public static void main(String[] args) {
     
		DeadThread dt = new DeadThread();
		System.out.println(dt.getState());
		for(int i=0;i<100;i++) {
     
			Thread mt = Thread.currentThread();
			System.out.println(mt.getName() + " " + i+" "+mt.isAlive());
			if(i==10) {
     
				dt.start();
			}
			//   dt        
//			if(i>10 || dt.isAlive() == false) {
     
//				dt.start();
//			}
			if(i==60) {
     
				dt.start();
				System.out.println(dt.getState().toString());
			}
			System.out.println(dt.getState());
		}
		
	}
}


実行時にi=60でエラーが発生し、すでに死亡しているスレッドは再起動できません.
初級カメとウサギの競走:カメとウサギの速度はランダム数0-10で
package day18;

/**
 *     
 * 
 * @author Acer
 *
 */
public class RaceTest extends Thread {
     
	private int sum = 0;
	//          ,
	private static boolean isEnd = false;
	public RaceTest(String name) {
     
		super(name);
	}

	@Override
	public void run() {
     
		while(sum<100) {
     
			if(isEnd == true) return;//stop();
			//      
			int speed = (int)(Math.random()*11);
			sum+=speed;
			//             
			//
			System.out.println(getName()+"  "+sum+" ");
			//             
			try {
     
				sleep(200);
			} catch (InterruptedException e) {
     
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		isEnd = true;
		System.out.println(getName()+"  !");
	}
	public static void main(String[] args) throws InterruptedException {
     
		System.out.println("    ");
		//          
		
		//  :            
		RaceTest rabbit = new RaceTest("  ");
		RaceTest tortoise = new RaceTest("  ");
		//          ,     
		rabbit.setPriority(Thread.MAX_PRIORITY);//    
		tortoise.setPriority(Thread.MIN_PRIORITY);//    
		//  
		rabbit.start();
		tortoise.start();
		//join()       ,      join             
		rabbit.join();
		tortoise.join();
		System.out.println("    ");
	}
}


コードではウサギとカメにmaxとminの優先度をそれぞれ設定、ウサギをカメより先に100に到達させることができる.でも玄学かもしれないけど、テストでカメはminの優先順位なのに常勝将軍
スレッドのセキュリティ
複数のスレッドが操作する統合データにロックをかけることで、あるスレッドがデータを操作している間に、他のスレッドもそのデータにアクセスしようとすると、そのデータにアクセスできなくなり、スレッドがブロックされる
二.心得
今日の主な内容はスレッドで、思ったほど難しくないような気がします.亀とウサギの競走の時にウサギに高い優先度を設定したのに、亀はウサギを地面にハンマーを押すことができます.これが玄学かもしれません.明日がんばれ!