java 中多线程

kevin_zwy 2015-08-08 04:22:06
public class TT implements Runnable{
int num=1;
public void run() {
try {
System.out.println("名字"+Thread.currentThread().getName());
num=1000;
System.out.println("num="+num);
//m1();
} catch (Exception e) {
e.printStackTrace();
}

}

public void m2(){
System.out.println(num);
}
public static void main(String[] args) throws Exception {
TT tt=new TT();
Thread thread=new Thread(tt);
thread.start();
tt.m2();
}

}

为什么输出的结果 每次都是
1
名字Thread-0
num=1000
上面的代码有 main 主线程 然后我又创建了线程thread 启动了线程 应该由CPU来分配随机 先执行run()和m2
为什么每次都是先执行 tt.m2()呢?

问题2
public synchronized void run(){} 和synchronized public void run(){} synchronized位置不一样 有区别吗?




...全文
113 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
metallica-run 2015-08-09
  • 打赏
  • 举报
回复
start()方法的启动后,run()方法不会立即运行,中间还有一些步骤.所有导致了主线程获得的值是TT线程执行前获取的值
sxiaobei 2015-08-09
  • 打赏
  • 举报
回复
yeild方法是让当前线程暂停,回到可运行的状态,并且只是让出cpu控制权给同优先级的线程,如果你调用yeild方法,可能就不会出结果,虽然main线程和你新建的线程优先级都是5,但是调用yeild只是会出现你自己的线程和main线程都是可运行状态,所以cpu轮转的时候,可能还是会调度main线程,所以你可以用sleep来实现你的目的。
util_00000 2015-08-08
  • 打赏
  • 举报
回复
如果你想看是不是run()完成后才运行主线程,,你可以在run()中写个循环输出,。我试过,,结果是 主线程和TT 是同时执行的。。。在子线程 改变 num 之前,主线程已经 获得了 num值,,只是 console 显示 顺序的问题,就行结果3。你可以调用sleep先休眠几毫秒 主线程,,num显示就会是 1000, 用对象锁或者 reentranlock 锁 锁住 num 也可以,防止 2个 线程 同时获得了num,,你的 线程 就是同时 获得 了num ,只是显示顺序 的问题。
util_00000 2015-08-08
  • 打赏
  • 举报
回复
问题一: 线程 新建 --> 就绪 --> 运行、阻塞 --> 死亡。 当线程 start() 后就就续了,接着运行,同时 当它 和 主进程没有 竞争同一个资源时,就不会再次回到就绪,而是一起运行的,, 你的问题,其实是 2个 线程同时运行, 只是显示的顺序和那个线程先执行完的问题。你可以加系统方法显示系统时间(单位:ms),见下例: 问题二:没区别。 代码:(可运行) public class TT implements Runnable{ int num=1; public void run() { try { //显示 当前 线程 名字 System.out.println("名字: "+Thread.currentThread().getName()); //显示 当前 系统 时间 System.out.println("public void run() 时间 :"+System.currentTimeMillis()); num=1000; System.out.println("num="+num); //m1(); } catch (Exception e) { e.printStackTrace(); } } public void m2(){ System.out.println("num = "+num); } public static void main(String[] args) throws Exception { TT tt=new TT(); //显示 当前 系统 时间 System.out.println("new TT() 时间 :"+System.currentTimeMillis()); Thread thread=new Thread(tt); thread.start(); //显示 当前 系统 时间 System.out.println("thread.start() 时间 :"+System.currentTimeMillis()); System.out.println(); tt.m2(); } } ************************************************************ 结果1 : new TT() 时间 :1439030411163 thread.start() 时间 :1439030411163 num = 1 名字: Thread-0 public void run() 时间 :1439030411163 num=1000 结果 2 : new TT() 时间 :1439030889192 thread.start() 时间 :1439030889193 num = 1 名字: Thread-0 public void run() 时间 :1439030889193 num=1000 结果3 : new TT() 时间 :1439030952815 thread.start() 时间 :1439030952816 名字: Thread-0 public void run() 时间 :1439030952817 num=1000 num = 1
kevin_zwy 2015-08-08
  • 打赏
  • 举报
回复
[quote=引用 1 楼 rumlee 的回复:] 问题1:启动线程是需要时间的,你这个测试结果并不能说明什么问题。你可以将t.m2也放在一个独立线程中执行,而不要放在主线程中执行,这样你应该就能够看到随机的效果了。 我在main方法中进行以下修改 添加了 Thread.yield(); 代码如下:,那么应该是暂停main()线程 先执行 thread线程,但结果还是先执行tt.m2(), 再执行了run() 求解!! public static void main(String[] args) throws Exception { TT tt=new TT(); Thread thread=new Thread(tt); thread.start(); Thread.yield(); tt.m2(); }
rumlee 2015-08-08
  • 打赏
  • 举报
回复
问题1:启动线程是需要时间的,你这个测试结果并不能说明什么问题。你可以将t.m2也放在一个独立线程中执行,而不要放在主线程中执行,这样你应该就能够看到随机的效果了。 问题2:没有区别

62,615

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧