在一个java程序里有三个线程main() t1 和t2 。它们可以分时进行,怎么知道main()执行完哪条语句执行t1,t1 执行完哪句执行t2,顺序怎么判断呢。谢谢

解决方案 »

  1.   

    这个很难这么笼统的说,需要看具体的你这三个线程的代码,因为三个线程共同竞争CPU资源,很多时候语句之间执行的顺序是不确定的,只有一部分语义确定的代码才有确定的顺序,你贴代码看看
      

  2.   

    这个是判断不了的,按时间片来分配时间然他们运行。当我们调用一个线程的.start()方法后,这个线程就会进入等待队列中,当别的线程时间片到期了,轮到该线程执行了,那么他就开始执行,不是说调用了.start(),该线程就开始执行。所以你并不知道主线程运行到什么地方,时间片刚好就到期了。除非你在主函数里面写一个循环,每次打印不同的信息,当控制台显示线程切换的时候,最后的输出就是主函数执行的最后一条语句,如果下一次轮到主函数执行了,就会从下一条开始执行。比如在主函数中写:for (int i = 0; i < 10000000; i++) {
      System.out.println(i);
    }
      

  3.   

    public class TT implements Runnable {
    int b = 100;

    public synchronized void m1() throws Exception{
    //Thread.sleep(2000);
    b = 1000;
    Thread.sleep(5000);
    System.out.println("b = " + b);
    }

    public synchronized void m2() throws Exception {
    Thread.sleep(2500);
    b = 2000;
    }

    public void run() {
    try {
    m1();
    } catch(Exception e) {
    e.printStackTrace();
    }
    }

    public static void main(String[] args) throws Exception {
    TT tt = new TT();
    Thread t = new Thread(tt);
    t.start();

    tt.m2();
    System.out.println(tt.b);
    }
    }非常不解。谢谢
      

  4.   

    start()之后,线程就开始独立执行了。这时候子线程跟主线程同时都在执行,无法预测接下来的语句哪句前哪句后。
    但既然中间有sleep(5000)这样的语句,基本上可以肯定在睡眠的时候其它线程不会闲着。
      

  5.   

    分析一下你给的代码,main本身是一个主进程,另外的两个线程分别是t.start()和tt.m2()这两行开启,这两个线程共享一个变量b的值。
    从执行顺序来看,这三个线程共同竞争CPU和内存资源,如果tt.m2()这个线程取得资源,优先运行(这个概率很大)那么输出结果可能是2000 b=1000 ,是m2先执行,主进程后执行,t最后执行
    还有一种可能是t.start()首先取得资源,执行结果是1000 b=1000,这个顺序是t先执行,主进程后执行,m2线程最后执行,这个概率要小很多,因为t.start()有5秒休息时间
      

  6.   

    这样就明白了。还有点问题,执行m1时当前对象被锁定,当前对象指的什么。Thread.sleep()是不是用到了多态。this.wait()是当前正在中访问的线程等待,this.notify()是唤醒一个正在当前对象上等待的线程,这里的对象又是什么。谢谢谢谢谢谢
      

  7.   

     当前对象就是你 this 指向的引用
      

  8.   

    首先,多线程是并发执行了。
    执行顺序,有操作系统,根据当前环境和条件来决定。
    程序员,一般无法获得执行顺序。其次,楼主的代码,只有两个线程在运行。main线程和t线程。
    synchronized的锁是加在tt对象上的。并且,程序只创建了一个tt对象。
    那么,tt对象的两个方法,不能同时被多个线程访问,只能逐个访问。main线程调用的m1方法,t线程调用的m2方法。
    如果m2先调用,m1后调用,输出结果b = 1000
    如果m1先调用,m2后调用,输出结果b = 1000
    因为,m2后调用,虽然b的值改了,但,没有输出语句,无法查看。