java中利用多线程对数组值进行修改,为什么不是想要的结果?
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,该怎样修改? 展开
并不是输出不会出现你想要的,,多去找下线程方面的资料看看,,
没有得到你想要的值是因为线程执行顺序造成的,,首先你这个程序运行起来总共有三个线程
主线程,线程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;
}
}
}
public static void main(String[] args) {
Happy.result();
Thread.sleep(1000);//让主线程暂停一下
for (int m : arr) {
System.out.println(m+" ");
}
}
还有一点就是你说i两个线程对arr进行修改,所以你做好把arr加把锁
广告 您可能关注的内容 |