1.主程序:用来做测试

这里之所以叫Tree是因为我之前写树了,偷懒就直接用了,和卖票的那个性质一样,只不过把买票的数作为下标锁住
import org.omg.Messaging.SyncScopeHelper;

import java.lang.reflect.Array;
import java.util.Arrays;
import java.util.Random;

public class TestThread {
    public static void main(String[] args) {
        Tree tree = new Tree();
        int[] arr = new int[]{1,2,3,4,5,6,7,8,9,10,11,12};
        int[] newarr = new int[arr.length];
        System.out.println(Arrays.toString(newarr));
        tree.value = arr.length-1;
        ThreadPiao t1 = new ThreadPiao("线程1",tree,arr,newarr);
        ThreadPiao t2 = new ThreadPiao("线程2",tree,arr,newarr);
        ThreadPiao t3 = new ThreadPiao("线程3",tree,arr,newarr);

        t1.start();
        t2.start();
        t3.start();

       try {
            t1.join();//这样可以使线程提前
            t2.join();
            t3.join();
       }catch (InterruptedException e){
            e.printStackTrace();
       }
        System.out.println("~~~~复制结束"+tree.value);
    }
}

Flag类,做信号量来中止进程。

public class Flag {
    public int flag = 0;
}
//这里之所以叫Tree是因为我之前写树了,偷懒就直接用了

import javax.sound.midi.Soundbank;
import java.lang.reflect.Array;
import java.util.Arrays;

public class Tree {
    int value;
    public synchronized void copy(  int[] arr, int newarr[] , Flag f, String name) { 
        if(value==-1) {
            f.flag=1;//信号中止线程
            return;
        }
        newarr[value] = arr[value];//用于赋值
        System.out.println(name+" 赋值了:"+newarr[value]+"-- 数组变化为: "+Arrays.toString(newarr));
        f.flag = 0;//继续进行
        value--;
    }
}

最后是我萌的线程类:

import sun.awt.SunHints;

import javax.naming.Name;
import javax.sound.midi.Soundbank;

public class ThreadPiao extends Thread {
    private String name;
    private Tree tree ;
    private int[] arr,newarr;

    ThreadPiao(String name, Tree tree,int[] arr,int[] newarr) {
        this.name = name;
        this.tree = tree;
        this.arr = arr;
        this.newarr = newarr;
    }


    public void run() {// synchronized 不用锁run只锁add ,这样的好处是由于此处没加锁_节省效率,<<只锁调用资源的方法就行>>
        Flag f = new Flag();
        while (f.flag==0) {
            tree.copy(arr,newarr,f,name);
            try {
                Thread.sleep(10);//这里是为了让线程的调用更分散,睡眠时间越长,随机性竞争越明显
            } catch (Exception e) {
                e.printStackTrace();
            }

        }
    }

}