Javaのマルチスレッド:2を、スレッドを作成するための4つの方法は?実行可能と呼び出し可能な違いは?スレッドどのような状態?

スレッドを作成するには1、4つの方法

(1)Threadクラスの継承、オーバーライドrun()メソッド

public class Rabbit  extends Thread{
	@Override
	public void run() {
		//线程体
		for(int i=0;i<100;i++){
			System.out.println("兔子跑了"+i+"步");
		}
	}	
}
public class RabbitApp {

	public static void main(String[] args) {
		// 创建子类对象
		Rabbit rab = new Rabbit();	
		// 对象.start()
		rab.start();// 不要调用run()方法
	}
}

(2)、Runnableインタフェースを達成するために、run()メソッド

public class Programmer implements Runnable{
	@Override
	public void run() {
		for(int i=0;i<67;i++)
		{
			System.out.println("一边敲helloWorld。。。。。");
		}
	}
}
/**
 *  * 创建线程:实现runnable接口+重写Run方法
 * 启动多线程:使用静态代理
 * (1)创建真实角色
 * (2)创建代理角色+真实角色的引用
 * (3)调用.start()
 * @author Linlin Zhao
 *
 */
public class ProgrammerApp {
public static void main(String[] args) {
	//创建真实角色
	Programmer pro=new Programmer();
	//创建代理角色+真实角色的引用
	Thread proxy=new Thread(pro);
	//调用start
	proxy.start();
	for(int i=0;i<67;i++)
	{
		System.out.println("一边谈恋爱。。。。。");
	}
}
}

(3)呼び出し可能インタフェースを実装し、()メソッドの呼び出し

/**
 * Callable可以对外声明异常,同时可以返回值
 * @author Linlin Zhao
 *
 */
public class CallableCreate {
	public static void main(String[] args) throws InterruptedException, ExecutionException {
		//创建线程
		ExecutorService ser=Executors.newFixedThreadPool(2);
		Race tortoise=new Race("乌龟",20);//小乌龟延时1000ms
		Race rabbit=new Race("小兔子",50);//小兔子休息20000ms
		//获取值
		Future<Integer> result1=ser.submit(tortoise);
		Future<Integer> result2=ser.submit(rabbit);
		System.out.println("--------------");
		
		Thread.sleep(10000);
		tortoise.setFlag(false);
		rabbit.setFlag(false);//停止线程循环
		
		int num1=result1.get();
		int num2=result2.get();
		System.out.println("乌龟跑了----->"+num1+"步");
		System.out.println("小兔子跑了----->"+num2+"步");
		//停止服务
		ser.shutdown();
	}

}
class Race implements Callable<Integer>{
private String name;//名称
private long time;//延时时间
private boolean flag=true;
private int step=0;//步数

public Race(){
	
}
public Race(String name){
	this.name=name;
}

	public Race(String name, long time) {
	super();
	this.name = name;
	this.time = time;
}
	@Override
	public Integer call() throws Exception {
		while (flag){
			Thread.sleep(time);//延时
			step++;
		}
		return step;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public long  getTime() {
		return time;
	}
	public void setTime(long time) {
		this.time = time;
	}
	public boolean isFlag() {
		return flag;
	}
	public void setFlag(boolean flag) {
		this.flag = flag;
	}
	public int getStep() {
		return step;
	}
	public void setStep(int step) {
		this.step = step;
	}
	
}

(4)は、起動スレッドを作成するスレッドプールを使用します。

サンプルコード可視リンク:
スレッドプールに関連する概念を作成する4つの方法、状態およびその他の問題

2違い、実行可能と呼び出し可能で

両方がインターフェイスであり、スレッドを作成するために使用することができます。エグゼキュータのフレームワーククラスに属する呼び出し可能。呼び出し可能インタフェースが実行可能機能に類似して、以下の点での主な違いの嘘:
(1)呼び出し可能なタスクの終了後に戻り値を提供することができます。Runnableをありません。
(2)呼び出し可能呼び出し()メソッドは、例外をスローすることができます。実行のRunnable()メソッドはできません。
工程(3)呼び出し可能な操作は、ターゲットスレッドの呼び出し例()メソッドの呼び出しを監視するために使用することができる将来のオブジェクトを取得することができます。

3、状態のスレッド?

生まれたばかりの状態、レディ状態、状態、ブロッキング状態、死の状態を実行している:スレッドが5つの状態があります。
ここに画像を挿入説明
(1)新生状態:(新)
スレッドオブジェクト、新生状態に入っているスレッドを作成した後。初期状態のスレッドは独自のメモリ空間を有し、この方法は、()の開始を呼び出すことで準備完了状態(runnablle)に入ります。

(2)準備完了状態(Runnableを)
レディ状態にスレッドが既に実行されている状態を有しているが、システム割り当てCPUを待っているので、準備ができた状態で、CPUが割り当てられていません。CPUたら、操作(ランニング)と呼び出し自体run()メソッドにそれを通します。

(3)動作状態:
状態を実行すると、自身のrun()メソッドを実行するスレッド。閉塞ため、または死亡のタスク原因の完了まで。

(4)は、状態をブロック:
スレッドがブロックされた状態にし、CPUを放棄一時的に、上で実行しない、いわゆるブロッキング状態が実行されています。そして、準備完了状態にある他のスレッドは、CPU時間を取得実行状態に入ることができます。排泄の閉塞の原因となるまでは、実行を継続するには、ブロッキング位置から再割り当てCPUが起動し、システムを待って、準備完了状態にスレッドすることができます。
閉塞原因:睡眠()を呼び出し、加入()、収量() というように、IOや他のリソースを取得するために待機。

(5)死の状態:
スレッドのライフサイクルの最終段階。他には、(停止を呼び出すことです)、またはスレッドを終了強制的に破棄()メソッドが、その力、前者は例外となり、二つの方法の使用はお勧めしませんが、一つはタスク不法死亡を完了することです:そこのスレッドで死亡の2つの原因があります終了は、ロックを解除しません。

公開された57元の記事 ウォン称賛13 ビュー1098

おすすめ

転載: blog.csdn.net/weixin_42924812/article/details/105209810