java中利用多线程对数组值进行修改,为什么不是想要的结果?

publicclassHappy{staticintarr[]={1,2,3,4,5};publicstaticvoidresult(){Bolg1p1=newBolg1... public class Happy {
static int arr[]={1,2,3,4,5};
public static void result() {
Bolg1 p1=new Bolg1(arr);
Bolg2 p2=new Bolg2(arr);
Thread t1=new Thread(p1);
Thread t2=new Thread(p2);
t1.start();
t2.start();
}
public static void main(String[] args) {

Happy.result();
for (int m : arr) {
System.out.println(m+" ");
}
}
}
class Bolg1 implements Runnable{
int[] arr;
public Bolg1(int[] arr ) {
this.arr=arr;
}
public void run() {
for (int i = 0; i < arr.length; i++) {

arr[i]=10;
i++;
}
}
}
class Bolg2 implements Runnable{
int[] arr;
public Bolg2(int[] arr ) {
this.arr=arr;
}
public void run() {
for (int j = 1; j < arr.length; j++) {
arr[j]=11;
j++;
}
}
}
为什么输出值不是10,11,10,11,10,该怎样修改?
展开
 我来答
ala400
2012-08-03 · TA获得超过1229个赞
知道小有建树答主
回答量:262
采纳率:100%
帮助的人:279万
展开全部

并不是输出不会出现你想要的,,多去找下线程方面的资料看看,,

没有得到你想要的值是因为线程执行顺序造成的,,首先你这个程序运行起来总共有三个线程

主线程,线程t1,线程t2


实际上cpu处理线程的时候并不是真正的同时进行,而是执行某个线程一段时间,然后在执行其他线程一段时间,一直这样循环下去


线程的执行顺序是不定的,不是每次都是t1先,t2后,执行顺序和线程的优先级有关系,在线程优先级都相同的情况下,执行权是随机分配的,,也就是说可能这次t1先执行,下次却是t2先执行,所以你要的结课是可能出现的,,但是不是每次都是你想要的结课,,而且一般情况下多线程并发访问数据的时候,我们都会做同步处理,避免数据出现紊乱,


当主线程随机到执行权,那么主线程先执行,所以这时候获取到的数据就可能是原始没改变的值,,当t1或t2随机到执行权,那么获取的数据就是被修改过的,,但是修改的结果是无规律的,,


下面是帮你修改了下的,,如果还不是你的结果,可以把Thread.sleep(时间)中的时间调大一点

public class Happy

{

    static int arr[]={1,2,3,4,5};

    public static void result()

    {

        Bolg1 p1=new Bolg1(arr);

        Bolg2 p2=new Bolg2(arr);

        Thread t1=new Thread(p1);

        Thread t2=new Thread(p2);

        t1.start();

        t2.start();

    }

    public static void main(String[] args) throws Exception

    {

        Happy.result();

        Thread.sleep(1000);// 暂停主线程1秒,,等待其他线程执行

        for(int m:arr)

        {

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

        }

    }

}

class Bolg1 implements Runnable

{

    int[] arr;

    public Bolg1(int[] arr)

    {

        this.arr=arr;

    }

    public void run()

    {

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

        {

            arr[i]=10;

        }

    }

}

class Bolg2 implements Runnable

{

    int[] arr;

    public Bolg2(int[] arr)

    {

        this.arr=arr;

    }

    public void run()

    {

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

        {

            arr[j]=11;

        }

    }

}

西二旗码农一枚
2012-08-03 · TA获得超过1640个赞
知道小有建树答主
回答量:1040
采纳率:0%
帮助的人:763万
展开全部
因为你子线程还没运行可能主线程就输出了arr了
public static void main(String[] args) {

Happy.result();
Thread.sleep(1000);//让主线程暂停一下
for (int m : arr) {
System.out.println(m+" ");
}
}

还有一点就是你说i两个线程对arr进行修改,所以你做好把arr加把锁
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式