當前位置:首頁 » 文件傳輸 » 線程訪問對象
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

線程訪問對象

發布時間: 2022-05-02 09:56:39

⑴ 現在有一個動態改變的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

⑺ 當一個線程訪問一個對象的方法時,另一個線程還能訪問這個對象嗎

可以啊,但是這樣可能會改變你想要得到的結果,可以用信號量啦約束,使一個對象被一個線程訪問的時候,另一個線程不能訪問。

⑻ 怎麼使用線程同時進行操作多個對象

局部變數不會受多線程影響
成員變數會受到多線程影響

多個線程應該是調用的同一個對象的同一個方法:
如果方法里無成員變數,那麼不受任何影響
如果方法里有成員變數,只有讀操作,不受影響