如何控制多个线程,使其按照一定的顺序执行(最原始的方法)

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最先执行后面代码

结果:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值