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();
}
}
}
以下是運行結果截圖: