第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定

關(guān)于使用Thread.yield()進(jìn)行線程通訊的問(wèn)題

//代碼1
package?communication;

import?java.util.Random;

public?class?Flag?{
	public?static?void?main(String[]?args)?{
		FlagSender?f?=?new?FlagSender();
		FlagRec?r?=?new?FlagRec(f);
		Thread?t1?=?new?Thread(f);
		Thread?t2?=?new?Thread(r);
		t1.start();
		t2.start();
	}
}
class?FlagSender?implements?Runnable{
	private?int?theValue;
	private?boolean?flag;
	
	public?int?getTheValue()?{
		return?theValue;
	}

	public?void?setTheValue(int?theValue)?{
		this.theValue?=?theValue;
	}

	public?boolean?isFlag()?{
		return?flag;
	}

	public?void?setFlag(boolean?flag)?{
		this.flag?=?flag;
	}

	@Override
	public?void?run()?{
		for?(int?i?=?0;?i?<?5;?i++)?{
			while(flag){
				Thread.yield();
			}
			theValue?=?new?Random().nextInt(1000);
			System.out.println("send?the?value?is?"+theValue);
			flag?=?true;
		}
	}
}
class?FlagRec?implements?Runnable{
	private?FlagSender?f;?
	public?FlagRec(FlagSender?f)?{
		super();
		this.f?=?f;
	}

	@Override
	public?void?run()?{
		for?(int?i?=?0;?i?<?5;?i++)?{
			while(!f.isFlag()){
				Thread.yield();
			}
			System.out.println("receive?the?value?is?"+f.getTheValue());
			f.setFlag(false);
		}
	}
}
//代碼2
package?communication;

import?java.util.Random;

public?class?WrongOfFlag?{
	public?static?void?main(String[]?args)?{
		FlagSender1?f?=?new?FlagSender1();
		FlagRec1?r?=?new?FlagRec1();
		Thread?t1?=?new?Thread(f);
		Thread?t2?=?new?Thread(r);
		t1.start();
		t2.start();
	}
}
class?FlagSender1?implements?Runnable{
	private?int?theValue;
	private?boolean?flag;
	
	public?int?getTheValue()?{
		return?theValue;
	}

	public?void?setTheValue(int?theValue)?{
		this.theValue?=?theValue;
	}

	public?boolean?isFlag()?{
		return?flag;
	}

	public?void?setFlag(boolean?flag)?{
		this.flag?=?flag;
	}

	@Override
	public?void?run()?{
		for?(int?i?=?0;?i?<?5;?i++)?{
			while(flag){
				Thread.yield();
			}
			theValue?=?new?Random().nextInt(1000);
			System.out.println("send?the?value?is?"+theValue);
			flag?=?true;
		}
	}
}
class?FlagRec1?implements?Runnable{
	FlagSender?f?=?new?FlagSender();
	@Override
	public?void?run()?{
		for?(int?i?=?0;?i?<?5;?i++)?{
			while(!f.isFlag()){
				Thread.yield();
			}
			System.out.println("receive?the?value?is?"+f.getTheValue());
			f.setFlag(false);
		}
	}
}

為什么要讓FlagSender作為FlagRec的成員,像代碼二中直接new了FlagSender為什么結(jié)果只輸出一個(gè)send the value is 138,然后就死循環(huán)空程序了,結(jié)果如下圖http://img1.sycdn.imooc.com//5895dbb30001498806280141.jpg

正在回答

1 回答

代碼1:兩個(gè)線程同時(shí)走,他倆公用一個(gè)FlagSender對(duì)象里面的flag,當(dāng)線程t1走第一遍時(shí),flag等于false,不等待直接輸出,然后將falg致成true,線程t1等待,這時(shí)候線程t2 while里面的!f.isFlag() 為false,所以往下進(jìn)行輸出又將flag致成false,這時(shí)線程t1又開始執(zhí)行。以此類推。

代碼2:兩個(gè)對(duì)象都在while里面進(jìn)行死循環(huán),所以只打印一次。

0 回復(fù) 有任何疑惑可以回復(fù)我~
#1

_Everglow 提問(wèn)者

懂了懂了,沒人喚醒FlagRec
2017-02-06 回復(fù) 有任何疑惑可以回復(fù)我~

舉報(bào)

0/150
提交
取消

關(guān)于使用Thread.yield()進(jìn)行線程通訊的問(wèn)題

我要回答 關(guān)注問(wèn)題
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)