zoukankan      html  css  js  c++  java
  • 线程的执行顺序

    线程的执行完全是自发的去抢CPU时间片,谁先抢到谁就先去执行
    package com.pers.xiancheng;
    public class Test implements Runnable { int count;//默认是0 static Object obj = new Object(); @Override public void run() { //synchronized块锁定的是整个对象 synchronized (obj) {//synchronized 是用来获得对象锁,只有获得锁的线程才能执行synchronized{}里面的代码 if (Thread.currentThread().getName().equals("a") || Thread.currentThread().getName().equals("b")) { count++; System.out.println(Thread.currentThread().getName() + "_" + count); } else { count--; System.out.println(Thread.currentThread().getName() + "_" + count); } } } public static void main(String[] args) throws InterruptedException { Test t = new Test(); //不确定的是执行的次序->输出的次序及结果...... /* d_-1 a_1 a_1 a_1 a_0 d_0 c_0 b_2 c_-1 c_-1 d_-1 c_1 b_0 b_0 b_0 d_0 * */ new Thread(t, "a").start(); new Thread(t, "b").start(); new Thread(t, "c").start(); new Thread(t, "d").start(); Thread.sleep(1000); System.out.println(t.count);//0 } }

     按照正常的逻辑,是没有办法去对线程的执行顺序进行控制的,因为线程的执行完全是自发地去抢CPU时间片,谁抢到谁先执行。
         除非你在程序内部控制,设计一个执行顺序记录的全局变量A。如果1执行完,变量A赋值为1,如果是2接着抢到了时间片,则可以直接正常执行,将变量A设置为2;如果是3抢到了CPU时间片,则直接退出线程,不允许3在变量A为1的时候执行

    package com.pers.xiancheng;
    /*1.如果你有三个线程,分别为T1,T2,T3,如何让线程T2在线程T1之后执行,在线程T3之前执行。
    答案是:使用线程的join方法,该方法的作用是“等待线程执行结束”,即join()方法后面的代码块都要等待现场执行结束后才能执行
     * 线程的优先级无法保障线程的执行次序。只不过优先级高的线程获取 CPU 资源的概率大一点而已。
     */
    public class ThreadABC {
        public static void main(String[] args) throws InterruptedException {
            Thread t1 = new Thread(new Runner());
            Thread t2 = new Thread(new Runner());
            Thread t3 = new Thread(new Runner());
            t1.start();
            t1.sleep(5000);
            t1.join();
    
            t2.start();
            t2.sleep(1000);
            t2.join();
            t3.start();
            t3.join();
    
        }
    
    }
    class Runner implements Runnable {
        @Override
        public void run() {
            System.out.println(Thread.currentThread().getName() + "");
        }
    }
    执行结果如下:
    Thread-0
    Thread-1
    Thread-2
  • 相关阅读:
    DataTable distinct 去重复
    EF 实体字段设置主键和自增
    select into from 和 insert into select 的用法
    EF的 JOIN操作
    Linq左关联 右关联 内关联
    MySQL MGR集群搭建
    论用户体验测试:牛逼的功能千篇一律,好的体验万里挑一
    Spring Cloud使用总结
    数据采集与分析的那些事——从数据埋点到AB测试
    如何能低成本地快速获取大量目标用户,而不是与竞争对手持久战?
  • 原文地址:https://www.cnblogs.com/hoobey/p/7493235.html
Copyright © 2011-2022 走看看