黑马程序员技术交流社区

标题: 线程的一些小问题 [打印本页]

作者: 长石    时间: 2014-1-14 17:17
标题: 线程的一些小问题
帮我理解一下线程的小问题
  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. }
复制代码

作者: 强子    时间: 2014-1-14 17:40
因为你使用了同步了啊,两个方法都用synchronized 来修饰,这时在多个线程中同一时间点只能有一个方法运行
你在main中new 了一个Thread 并调用了start方法开启了一个线程 这时这个线程和main所在的线程是同时执行的,这就得看谁先进入test的两个方法中了
可以看看Thead的源码中start方法,其实里面并不是直接调用test的run方法,调用之前还要进行很多操作,这些操作当然会占用一定的时间,所以你new的线程比main所在线程后进入了test的方法,他就只能等待main执行完毕后才能执行。
而当你让main线程sleep的时候  你new的Thread有了足够的时间进入test的方法,那main也就只能等待他执行完了。
希望对你有所帮助。
作者: 淡夜清风    时间: 2014-1-14 17:43
你的main()相当于主线程。
当你启动新的线程 t.start();时,你的主线程仍然在运行,而且线程启动大概需要几毫秒,
这个时间里main()线程仍然在向下执行test.m2();




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2