重要なポイントと例をマルチスレッド

マルチスレッド

マルチスレッドとは何ですか。

マルチタスク複数のパスは、同時に複数の連続マルチスレッドストリーム行います

マルチスレッドの利点:

実行しながら、効率を改善

マルチスレッド短所:

コンプレックス

マルチスレッドの作成しました:

  1. スレッドクラス継承、オーバーライドrun()メソッドは、スレッド本体RUNマルチスレッドで定義された方法

    	/**
     * 线程创建方式
     * @author zhuch
     *
     */
    public class ThreadTest extends Thread{
    
    	@Override
    	public void run() {
    		for (int i = 0; i < 5; i++) {
    			System.out.println("犯困");
    		}
    		
    	}
    	
    	
    	
    	
    	public static void main(String[] args) throws InterruptedException {
    		//创建
    		ThreadTest t=new ThreadTest();
    		//开启
    		t.start();
    		
    		// TODO Auto-generated method stub
    		for (int i = 0; i < 5; i++) {
    			System.out.println("瞌睡");
    			Thread.sleep(100);
    		}
    	}
    
    }
    
  2. Runnableを、オーバーライドrun()メソッドを実装

    推奨:

    1. 単一継承の制限を回避
    2. リソースの共有
    /**
     * 线程创建方式2
     * @author zhuch
     *
     */
    public class RunnableTest implements Runnable{
    
    	
    
    	@Override
    	public void run() {
    		// TODO Auto-generated method stub
    		for (int i = 0; i < 5; i++) {
    			System.out.println("梦想");
    		}
    	}
    	
    	
    	
    	public static void main(String[] args) throws InterruptedException {
    		// TODO Auto-generated method stub
    		Thread t=new Thread(new RunnableTest());
    		
    		t.start();
    		
    		
    		for (int i = 0; i < 5; i++) {
    			System.out.println("远方");
    			Thread.sleep(10);
    		}
    	}
    
    }
    
  3. 達成するための呼び出し可能インターフェース、書き換えメソッド呼び出し

    利点:

    1. あなたは例外をスローすることができます
    2. 戻り値を受け取ります

    短所:トラブル

セキュリティスレッド:

  • スレッドで複数のスレッドの同時動作は、制御セキュリティの必要性を不安の唯一の資源問題が発生する可能性があります

ゲンロック:

同期
  • {}のコードを実行するスレッドをキューイング

  • シンクブロック同期(ロックされたコンテンツ){}同期コード範囲

  • ロックコンテンツ:このクラスの.classリソース(メンバ変数)

  • すべてのオブジェクトがロックされているようなクラスの.classこのクラスのすべての内容と同等の、クラスには、ロックされました

  • すべてのオブジェクトと等価でこの呼び出しオブジェクトのメソッド、リソースの現在のメンバーはロックされている、あなただけのリソースをロックすることができます

  • リソース:カスタム場合はメンバ変数、データ型は、オブジェクトを参照する必要があります

  • ロック範囲:{} - コードの>範囲

  • 注意:

    • ロックは、非効率的な大きすぎます
    • ロック範囲は、ロック、小さすぎません
    • ロックと同じ内容
    /**
     * 多线程打印12A23B45C67D...直到字母打印完结束
     * @author zhuch
     *
     */
    
    public class Test {
    	
    	public static void main(String[] args) {
    		//创建对象
    		PrintTest pr=new PrintTest();
    		//开启线程
    		new Thread(new Number(pr)).start();
    		new Thread(new CharTest(pr)).start();
    		
    	}
    
    }
    
    //行为
    class PrintTest{
    	//成员变量
    	boolean flag=false;
    	int num=1;
    	char num1='A';
    	//打印数字(同步块)
    	public synchronized void number() {
    		if(flag==true) {
    			try {
    				this.wait();
    			} catch (InterruptedException e) {
    				// TODO Auto-generated catch block
    				e.printStackTrace();
    			}
    		}else {
    			try {
    				Thread.sleep(200);
    			} catch (InterruptedException e) {
    				// TODO Auto-generated catch block
    				e.printStackTrace();
    			}
    			
    			for(int i=0;i<2;i++) {
    				if(num==53) {
    					return;
    				}
    				System.out.print(num++);
    			}
    			
    			flag=true;
    			this.notify();
    		}
    	}
    	
    	//打印字母(同步块)
    	public synchronized void charTest() {
    		if(flag==false) {
    			try {
    				this.wait();
    			} catch (InterruptedException e) {
    				// TODO Auto-generated catch block
    				e.printStackTrace();
    			}
    		}else {
    			try {
    				Thread.sleep(200);
    			} catch (InterruptedException e) {
    				// TODO Auto-generated catch block
    				e.printStackTrace();
    			}
    			System.out.print((char)(num1++));
    			flag=false;
    			this.notify();
    		}
    	}
    	
    }
    //数字类实现Runnable接口重写run方法
    class Number implements Runnable{
    	PrintTest pr=null;
    	
    	
    	
    	public Number(PrintTest pr) {
    		super();
    		this.pr = pr;
    	}
    
    
    
    	@Override
    	public void run() {
    		// TODO Auto-generated method stub
    		while(true) {
    			pr.number();
    		}
    	}
    	
    }
    //字母类实现Runnable接口重写run方法
    class CharTest implements Runnable{
    	PrintTest pr=null;
    	
    	
    	
    	public CharTest(PrintTest pr) {
    		super();
    		this.pr = pr;
    	}
    
    
    
    	@Override
    	public void run() {
    		// TODO Auto-generated method stub
    		while(true) {
    			pr.charTest();
    		}
    	}
    	
    }
    
    public class SynchronizedTest implements Runnable{
    	Ticket ticket=new Ticket();
    	
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
    		SynchronizedTest syn=new SynchronizedTest();
    		new Thread(syn,"A").start();
    		new Thread(syn,"B").start();
    		new Thread(syn,"C").start();
    	}
    
    	@Override
    	public void run() {
    		// TODO Auto-generated method stub
    		while(true) {
    			synchronized(this) {
    				if(ticket.num<=0) {
    					break;
    				}
    				try {
    					Thread.sleep(2);
    				} catch (InterruptedException e) {
    					// TODO Auto-generated catch block
    					e.printStackTrace();
    				}
    				System.out.println(Thread.currentThread().getName()+"正在购买第"+ticket.num-- +"张票");
    			}
    		}
    	}
    
    }
    class Ticket{
    	int num=100;
    }
    

スレッドのステータス:

  • 新生児の状態:新しいスレッドを作成します

  • レディ状態:CPUスケジューリングを待って、レディキューにスレッドを開始します()

  • 動作状態:呼び出し元のスレッドに割り当てられたCPU時間のスライス、スレッドが実行されます

  • ブロッキング状態:スリープ()...

  • 終了状態:スレッドの終了

  • すぐにブロッキング状態にスレッドとして、ブロック解除した後、実行するようにすぐに復元されないように、それは再びCPUスケジューリングを待って、準備完了状態に戻ります

  • 状態でいったんは回復することはありません、スレッドを終了します

  • どのように準備状態へのスレッド:

    • 1.start()
    • 2.ブロック解除
    • 3.スレッドの切り替えが切り替えられたスレッドは、状態にできるようになります
    • 4.yield()礼譲スレッド
  • 状態への道をブロックします:

    • 1.sleep

    • 2.wait

    • 3.join

  • スレッドの終了を制御する方法:

    • 1.stop ...お勧めできません
    • 2.解析は表し
    • 3.通常の実行が終了
  • 睡眠():スリープ状態へのスレッド

    • 1)をシミュレートレイテンシー
    • 2)可能性の倍率
    • 休息をミリ秒単位で指定し、(リソースがベッドに入ることを確実にするために)ロックオブジェクトをさせないであろう、CPUリソースをしてみましょう
public class StateTest implements Runnable{

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		StateTest sta=new StateTest();
		new Thread(sta,"A").start();
		new Thread(sta,"B").start();
	}

	@Override
	public void run() {
		// TODO Auto-generated method stub
		Thread t=new Thread(()-> {
			for (int i = 0; i < 20; i++) {
				System.out.println("插队");
				try {
					Thread.sleep(5);
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		});
		
		
		t.start();
		try {
			t.join();//方法插队
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		System.out.println(Thread.currentThread().getName()+"开始执行");
		Thread.yield();//礼让线程
		System.out.println(Thread.currentThread().getName()+"结束执行");
		
	}
	

}

getStateを()内のスレッドはスレッドの状態を取得します

スレッドの優先順位:

  •  提高先执行的概率
    
  • getPriority()は、スレッドの優先順位を返します
  • setPriorityを(int newPriority)このスレッドの優先順位を変更します
    • 10 1〜10 1分5デフォルトの最大
public class StateDemo02 {
	public static void main(String[] args) {
		Thread th=new Thread(()->{
			for(int i=0;i<=10;i++){
				if(i==5){
					try {
						Thread.sleep(5);
					} catch (Exception e) {
						e.printStackTrace();
					}
				}
			}
		});
		th.setPriority(10);
		System.out.println(th.getPriority());
		
		System.out.println("th线程状态"+th.getState());
		th.start();
		
		while(true){
			Thread.State state=th.getState();
			System.out.println(state);
			if(state ==Thread.State.TERMINATED){
				break;
			}
			try {
				Thread.sleep(2);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}
}
公開された13元の記事 ウォン称賛13 ビュー502

おすすめ

転載: blog.csdn.net/Rabbit_white_/article/details/104036310