⑴ 現在有一個動態改變的C#對象 obj,兩個線程都需要訪問這個對象。如何控制這兩個線程排隊訪問
可以新建另外的一個類ControlObj,通過該類控制對obj的訪問,
類ControlObj中有靜態變數canDo(bool類型),當其中一個線程(線程A)訪問obj後,canDo=false,另一個線程(線程B)訪問時候循環等待,當線程A訪問完後,canDo=true,這時線程B才能訪問。
⑵ java 多線程 兩個線程訪問兩個對象中不同的synchronized修飾的方法。(方法和對象都是同一個類的)
先上結論:兩個線程訪問不同對象中不同的synchronized方法不會受到synchronized的限制。
程序運行結果之所以這樣,原因在於run()方法的實現導致的。
線程1中,先調用m.test1(),接著Thread.sleep(1000)
線程2中,先Thread.sleep(1000),接著調用m.test2()
主程序中,線程1與2都有可能先開始,無論誰先開始,結果都是線程1中m.test1()先結束,線程2中m.test2()後結束。
因為輪到線程2時,先Thread.sleep(1000),將資源讓給線程1
改進方法,應該在列印時,讓線程sleep
classTest{
synchronizedpublicvoidtest1(){
for(intp=0;p<5;p++){
try{
Thread.sleep(500);
}catch(InterruptedExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
System.out.println("s1.run.TestSynchronized_test1");
}
}
synchronizedpublicvoidtest2(){
for(intp=0;p<5;p++){
try{
Thread.sleep(500);
}catch(InterruptedExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
System.out.println("s2.run.TestSynchronized_test2");
}
}
}
run()方法中直接調用即可
classTestSynchronized_1implementsRunnable{
privateTestm;
publicTestSynchronized_1(Testm){
this.m=m;
}
publicvoidrun(){
m.test1();
}
}
classTestSynchronized_2implementsRunnable{
privateTestm;
publicTestSynchronized_2(Testm){
this.m=m;
}
publicvoidrun(){
m.test2();
}
}
輸出結果如下:
s2.run.TestSynchronized_test 2
s2.run.TestSynchronized_test 2
s1.run.TestSynchronized_test 1
s1.run.TestSynchronized_test 1
s2.run.TestSynchronized_test 2
s1.run.TestSynchronized_test 1
s2.run.TestSynchronized_test 2
s1.run.TestSynchronized_test 1
s2.run.TestSynchronized_test 2
⑶ 當一個線程進入一個對象的一個synchronized方法後,其它線程是否可進入此對象的其它方法
不能,一個對象的一個synchronized方法只能由一個線程訪問。對象的synchronized方法不能進入了,但它的其他非synchronized方法還是可以訪問的。
多線程有兩種實現方法,分別是繼承Thread類與實現Runnable介面。
同步的實現方面有兩種,分別是synchronized,wait與notify。
wait():使一個線程處於等待狀態,並且釋放所持有的對象的lock。
sleep():使一個正在運行的線程處於睡眠狀態,是一個靜態方法,調用此方法要捕捉InterruptedException異常。
notify():喚醒一個處於等待狀態的線程,注意的是在調用此方法的時候,並不能確切的喚醒某一個等待狀態的線程,而是由JVM確定喚醒哪個線程,而且不是按優先順序。
Allnotity():喚醒所有處入等待狀態的線程,注意並不是給所有喚醒線程一個對象的鎖,而是讓它們競爭。
(3)線程訪問對象擴展閱讀
線程的特點:
1、線程是輕量級的進程;
2、線程沒有獨立的地址空間(內存空間);
3、線程是由進程創建的(寄生在進程);
4、一個進程可以擁有多個線程-->這就是我們常說的多線程編程;
5、線程有幾種狀態:
a、新建狀態(new)
b、就緒狀態(Runnable)
c、運行狀態(Running)
d、阻塞狀態(Blocked)
e、死亡狀態(Dead)
多線程的好處:
1、充分利用CPU的資源;
2、簡化編程模型;
3、帶來良好的用戶體驗。
⑷ java中一個線程調用一個對象的一個同步方法,那麼另一個線程能否同時訪問此對象的另一個同步方法
不能。另一個線程可以訪問此對象的其它非同步方法,而此同步方法不可以訪問!
概括地說:
一個線程在訪問一個對象的同步方法時,另一個線程可以同時訪問這個對象的非同步方法。
一個線程在訪問一個對象的同步方法時,另一個線程不能同時訪問這個同步方法。
一個線程在訪問一個對象的同步方法時,另一個線程不能同時訪問這個對象的另一個同步方法。
⑸ java 怎麼在一個線程對象訪問某類的時候 追加一個任務在其執行完之後執行
java.util.concurrent.CountDownLatch 這個類可以實現你所要的功能
例如:CountDownLatch latch = new CountDownLatch(5) //聲明計數器為5個
Thread t = new Thread() {
public void run() {
try {
//TODO 你的應用
} catch (Exception e) {
//TODO 異常處理
}
finally {
latch.countDown(); //這句是關鍵
System.out.println("ok"); //5個線程都跑完後輸出
}
}
};
t.start();
然後讓以上操作循環五次(就是說同時開5個線程),那麼這個"ok"就會在等到這5個線程都ok後才會被輸出一次。
⑹ C#如何在線程中訪問控制項對象
利用ListView.Invoke解決跨線程安全調用,關鍵代碼如下:
voidFindFileInDir(){
if(listView2.InvokeRequired)
{
//跨線程調用
listView2.Invoke(newMethodInvoker(delegate
{
listView2.Items.Add(path);
}));
}
else
{
//直接調用
listView2.Items.Add(path);
}
}//EndofFindFileInDir
⑺ 當一個線程訪問一個對象的方法時,另一個線程還能訪問這個對象嗎
可以啊,但是這樣可能會改變你想要得到的結果,可以用信號量啦約束,使一個對象被一個線程訪問的時候,另一個線程不能訪問。
⑻ 怎麼使用線程同時進行操作多個對象
局部變數不會受多線程影響
成員變數會受到多線程影響
多個線程應該是調用的同一個對象的同一個方法:
如果方法里無成員變數,那麼不受任何影響
如果方法里有成員變數,只有讀操作,不受影響