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();
}
}
}
以下是运行结果截图: