import java.util.Arrays;
public class ThreeWaysToControlThreadRunningByOrders {
public static void main(String[] args) {
method();
}
// 最原始的方法,假设有是个线程
public static void method(){
// 创建一个线程数组,长度为10
Thread[] thread=new Thread[10];
TaskD taskD = new TaskD();
for (int i = 0; i < thread.length; i++) {
thread[i]=new Thread(taskD,"线程"+(i+1));
}
// 到目前位置,线程数组里面的元素已经都有了
// 问题是如何使这些线程按照索引到小顺序,一次执行,执行一个线程就睡一下(太低级了)
for (int i = 0; i < thread.length; i++) {
thread[i].start();
}
}
// 判断一个数是不是数组里面最小的数,如果是,就删除此数
public static boolean isMinValue(int[] arr,int num){
// 对数组进行排序,第一个数就是最小的数
Arrays.sort(arr);
boolean flag= num==arr[0]?true:false;
return flag;
}
}
线程任务类
class TaskD implements Runnable{
//定义一个变量,当来一个线程让其增加1,当进来的线程如果等于和i相等,就让其执行,否则就让其等待
private int i=1;
@Override
public void run() {
// 如果进来的第一个线程不是1,就让其使劲循环判断
while(true){
if (i==Integer.parseInt(Thread.currentThread().getName().substring(2))){
synchronized (this){
i+=1;
System.out.println(Thread.currentThread().getName()+"----执行了");
}
}
// 当所有的线程都跑完了,就跳出循环
if (i==11){
break;
}
}
System.out.println(Thread.currentThread().getName());
}
}
思路分析:
1.如果第一个进来的是线程1,那么进入同步块里面,i加1,执行输出语句,然后判断第二个if,
然后继续判断while的循环条件,判断为true,然后继续判断第一个if,不对,判断第二个
if,有不对,然后继续判断while的条件,始终为true,然后继续判断:线程1一直处在判断中
2.如果第一个进来的线程3,那么不会进入同步代码块,不会输出语句,判断第二个if,不对,然后
判断while条件,为true,然后继续判断第一个if,如果刚好此时线程2执行完了,那么此时i=3
线程3会判断第一个if,成立,然后进入同步代码块,然后输出语句,然后判断第二个if,不对,然后
再判断while条件,继续循环;
3.所以结果就是,执行进入同步代码块后的线程继续都在while里面循环,不停的做判断,
因为只有线程执行完了run方法,这个线程才会结束.而这些线程永远都会在while这个盒子
里面不停地做判断
4.当最后一个线程,线程10,进入同步代码块里面后,然后判断第二个if,成立,然后break,此时所有的线程从while这个盒子里面跳出来,每个线程执行完while{}块后面的代码,并且未必是线程10最先执行后面代码
结果: