A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 长石 中级黑马   /  2014-1-14 17:17  /  1433 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

帮我理解一下线程的小问题
  1. import java.util.*;
  2. import java.text.*;

  3. public class Thread01
  4. {
  5. public static void main(String []args)throws Exception{

  6.   Test test = new Test();
  7.   
  8.   Thread t = new Thread(test);
  9.   
  10.   t.start();   //启动run 调用m1

  11.   //如果 这里加个 Thread.sleep();   那么就m1先执行   

  12. test.m2(); //主线程 调用 m2

  13.   //问题:为什么每次运行都先执行m2  而且我把他俩优先级改了 还是每次都是 m2先执行,
  14. }
  15. }


  16. class Test implements Runnable
  17. {

  18. public void run(){
  19.   m1();
  20. }

  21. public synchronized void m1(){
  22.   System.out.println("m1........");
  23. }

  24. public synchronized void m2(){
  25.   
  26.   System.out.println("m2.........");
  27. }
  28. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
ily521125 + 1 神马都是浮云

查看全部评分

2 个回复

正序浏览
你的main()相当于主线程。
当你启动新的线程 t.start();时,你的主线程仍然在运行,而且线程启动大概需要几毫秒,
这个时间里main()线程仍然在向下执行test.m2();

评分

参与人数 1技术分 +1 收起 理由
ily521125 + 1 赞一个!

查看全部评分

回复 使用道具 举报
因为你使用了同步了啊,两个方法都用synchronized 来修饰,这时在多个线程中同一时间点只能有一个方法运行
你在main中new 了一个Thread 并调用了start方法开启了一个线程 这时这个线程和main所在的线程是同时执行的,这就得看谁先进入test的两个方法中了
可以看看Thead的源码中start方法,其实里面并不是直接调用test的run方法,调用之前还要进行很多操作,这些操作当然会占用一定的时间,所以你new的线程比main所在线程后进入了test的方法,他就只能等待main执行完毕后才能执行。
而当你让main线程sleep的时候  你new的Thread有了足够的时间进入test的方法,那main也就只能等待他执行完了。
希望对你有所帮助。

评分

参与人数 1技术分 +1 收起 理由
ily521125 + 1 赞一个!

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马