當前位置:首頁 » 密碼管理 » java多線程訪問數組

java多線程訪問數組

發布時間: 2022-09-22 08:33:35

A. java怎麼訪問數組

int [] arr=new int[]{1,2,3,4};
for(int i=0;i<arr.length;i++){
System.out.println("我是第"+i+"位:"+arr[i]);

}

B. java中利用多線程對數組值進行修改,為什麼不是想要的結果

並不是輸出不會出現你想要的,,多去找下線程方面的資料看看,,

沒有得到你想要的值是因為線程執行順序造成的,,首先你這個程序運行起來總共有三個線程

主線程,線程t1,線程t2


實際上cpu處理線程的時候並不是真正的同時進行,而是執行某個線程一段時間,然後在執行其他線程一段時間,一直這樣循環下去


線程的執行順序是不定的,不是每次都是t1先,t2後,執行順序和線程的優先順序有關系,在線程優先順序都相同的情況下,執行權是隨機分配的,,也就是說可能這次t1先執行,下次卻是t2先執行,所以你要的結課是可能出現的,,但是不是每次都是你想要的結課,,而且一般情況下多線程並發訪問數據的時候,我們都會做同步處理,避免數據出現紊亂,


當主線程隨機到執行權,那麼主線程先執行,所以這時候獲取到的數據就可能是原始沒改變的值,,當t1或t2隨機到執行權,那麼獲取的數據就是被修改過的,,但是修改的結果是無規律的,,


下面是幫你修改了下的,,如果還不是你的結果,可以把Thread.sleep(時間)中的時間調大一點

publicclassHappy

{

staticintarr[]={1,2,3,4,5};

publicstaticvoidresult()

{

Bolg1p1=newBolg1(arr);

Bolg2p2=newBolg2(arr);

Threadt1=newThread(p1);

Threadt2=newThread(p2);

t1.start();

t2.start();

}

publicstaticvoidmain(String[]args)throwsException

{

Happy.result();

Thread.sleep(1000);//暫停主線程1秒,,等待其他線程執行

for(intm:arr)

{

System.out.println(m+"");

}

}

}

classBolg1implementsRunnable

{

int[]arr;

publicBolg1(int[]arr)

{

this.arr=arr;

}

publicvoidrun()

{

for(inti=0;i<arr.length;i+=2)

{

arr[i]=10;

}

}

}

classBolg2implementsRunnable

{

int[]arr;

publicBolg2(int[]arr)

{

this.arr=arr;

}

publicvoidrun()

{

for(intj=1;j<arr.length;j+=2)

{

arr[j]=11;

}

}

}

C. java中怎麼用多個線程同時對一個文件讀取,最終將文件內容保存到一個位元組數組中去呢

多線程讀取文件在一塊硬碟上沒用,瓶頸在硬碟I/O,而不在CPU和內存。讀取文件時,CPU不用復雜的計算工作,只是數據傳輸而已,多線程反而造成磁頭來回移動,效率不高。如果是兩塊以上的硬碟,可以用不同的線程訪問不同的硬碟,效率比單線程要高
而且多線程操作同一文件除了效率還會有多線程問題,多個線程同時往數組里存數據還會有線程安全問題,如果不同步處理讀取的文件就是錯誤的。
如果讀取的話只能設置每個線程各自讀取偏 移量
讀取文件大小(比如大小是200K)。 2,啟動5個線程,第一個線程讀到40,第二個線程跳過40在讀到80,總之得合理安排好各個線程讀取的大小。這樣才能不重復讀取。大數據處理框架maprece原理和此類似

D. java 多線程訪問數組求和

publicclassT
{
int[]input={100,5,98,77,60,88,36};
int[]output={0,0,0,0,0,0,0};
intcurr=0;

publicsynchronizedintgetCurr(){
if(curr==input.length)
return-1;
returncurr++;
}{
Tt;
publicWorker(Tt){
this.t=t;
}

publicvoidrun(){
intidx;
while((idx=t.getCurr())!=-1){
intsum=0;
for(inti=0;i<t.input[idx];i++){
sum+=i;
}
t.output[idx]=sum;
}
System.out.println(getName()+"over");
}
}


publicstaticvoidmain(String[]args)throwsException{
Tt=newT();
Threadt1=newWorker(t);
Threadt2=newWorker(t);
Threadt3=newWorker(t);
t1.start();
t2.start();
t3.start();
t1.join();
t2.join();
t3.join();
for(inti=0;i<t.output.length;i++){
System.out.print(t.output[i]+",");
}
System.out.println();
}
}

E. java中多線程怎麼實現數組對象的共享

例如:一個線程正准備往進去寫數據,突然切到另一個線程它先寫了進入,在切回來這個線程並不知道這個位置已經寫入了數據,所以它還是會傻傻的寫入數據,這樣另一個線程的數據就被覆蓋了。如果是一邊添加 ,一邊遍歷的話程序會產生異常。
所以要用onwritearraylist是最好的選擇,但是注意的是,添加元素時它的性能不是很好 。

F. 關於java 數組和多線程

線程肯定是用到的

抽象類,是必須的,一個當其他類繼承了這個抽象類,必須繼承抽象方法

例如 一個人,當然有吃喝睡這三個行為

首先你是一個人,所以你繼承這個抽象類,你必須繼承這三個行為

第二 你還是個學生,所以你有學習這個行為

所以抽象類,是一般包括一些共同的特性

G. java 多線程數組當形參

你的屬性在初始化時,構造方法還沒有執行,此時new Find(x,a,b)中參數的值還是空的,所以出現你那個錯誤。線程類應該改為:
class ThdFind extends Thread {
protected int a, b, x;

protected int p[] = new int[10000];

Find findson = null;

public ThdFind(int p[], int a, int b) {
this.a = a;
this.b = b;
this.p = p;
findson = new Find(x, a, b);
}

public void run() {
findson.f(p);
}
}

H. java多線程訪問同一個數組,存在並發問題嗎,每個線程訪問的是數組的不同部分,不存在沖突

多線程訪問同一資源肯定存在並發問題,如數據丟失。
如果,每個線程訪問不同部分,不會存在沖突問題。

沖突問題,歸根結底是,多線程對同一資源的操作,資源你可以想像成一個對象、一個文件等等
在處理此問題時,可以使用同步,來保證線程安全

I. 想寫一個java的多線程,在線程中定義一個數組,實現對buffer數組中接受數據的復制,並清空buffer。

這個簡單,先寫一個ReceData類,這個類繼承Runnable介面;在這個類中重寫run方法,這個方法就是接收數據,並清空buff.
在主線程類中new Thread(ReceData).start()即可。
希望可以幫到你。這是最簡單入門的寫法;以後你熟悉之後可以寫成匿名內部類更簡單。

J. java如何訪問全部的數組

利用java的反射機制即可實現:

public class obj {

public String[] a = {"a1","a2","a3"};

public String[] b = {"b1","b2"};

}

import java.lang.reflect.Field;

public class Main {

public static void main(String[] args) {

try {

obj o = new obj();

Field arrayA = obj.class.getField("a");

String[] arr1 = (String[])arrayA.get(o);//兩步即可獲得數組a的對象

System.out.println("數組a長度為:"+arr1.length);

System.out.println(arr1[0]+","+arr1[1]+","+arr1[2]);

Field arrayB = obj.class.getField("b");

arrayB.setAccessible(true);//我也不知道setAccessible是干什麼的,但是我在學習的時候發現別人寫的示例代碼裡面就有這個,你可以自行去搜一下用法

String[] arr2 = (String[])arrayB.get(o);

System.out.println("數組b長度為:"+arr2.length);

System.out.println(arr2[0]+","+arr2[1]);

} catch (IllegalArgumentException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (NoSuchFieldException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (SecurityException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (IllegalAccessException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

}

以下是運行結果截圖:

熱點內容
fbe加密 發布:2025-05-18 01:16:34 瀏覽:250
求中點編程 發布:2025-05-18 01:03:14 瀏覽:840
安卓pay是什麼 發布:2025-05-18 01:02:27 瀏覽:747
免費手游掛機腳本 發布:2025-05-18 00:55:43 瀏覽:354
sd卡手機存儲系統存儲 發布:2025-05-18 00:55:28 瀏覽:637
pythonlistintstr 發布:2025-05-18 00:48:18 瀏覽:604
輕應用緩存 發布:2025-05-18 00:31:02 瀏覽:252
鳥存儲空氣 發布:2025-05-18 00:20:24 瀏覽:201
linux刻錄iso 發布:2025-05-18 00:16:15 瀏覽:663
php動態參數 發布:2025-05-18 00:12:05 瀏覽:425