有关线程执行的顺序 在一个java程序里有三个线程main() t1 和t2 。它们可以分时进行,怎么知道main()执行完哪条语句执行t1,t1 执行完哪句执行t2,顺序怎么判断呢。谢谢 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 这个很难这么笼统的说,需要看具体的你这三个线程的代码,因为三个线程共同竞争CPU资源,很多时候语句之间执行的顺序是不确定的,只有一部分语义确定的代码才有确定的顺序,你贴代码看看 这个是判断不了的,按时间片来分配时间然他们运行。当我们调用一个线程的.start()方法后,这个线程就会进入等待队列中,当别的线程时间片到期了,轮到该线程执行了,那么他就开始执行,不是说调用了.start(),该线程就开始执行。所以你并不知道主线程运行到什么地方,时间片刚好就到期了。除非你在主函数里面写一个循环,每次打印不同的信息,当控制台显示线程切换的时候,最后的输出就是主函数执行的最后一条语句,如果下一次轮到主函数执行了,就会从下一条开始执行。比如在主函数中写:for (int i = 0; i < 10000000; i++) { System.out.println(i);} 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); }}非常不解。谢谢 start()之后,线程就开始独立执行了。这时候子线程跟主线程同时都在执行,无法预测接下来的语句哪句前哪句后。但既然中间有sleep(5000)这样的语句,基本上可以肯定在睡眠的时候其它线程不会闲着。 分析一下你给的代码,main本身是一个主进程,另外的两个线程分别是t.start()和tt.m2()这两行开启,这两个线程共享一个变量b的值。从执行顺序来看,这三个线程共同竞争CPU和内存资源,如果tt.m2()这个线程取得资源,优先运行(这个概率很大)那么输出结果可能是2000 b=1000 ,是m2先执行,主进程后执行,t最后执行还有一种可能是t.start()首先取得资源,执行结果是1000 b=1000,这个顺序是t先执行,主进程后执行,m2线程最后执行,这个概率要小很多,因为t.start()有5秒休息时间 这样就明白了。还有点问题,执行m1时当前对象被锁定,当前对象指的什么。Thread.sleep()是不是用到了多态。this.wait()是当前正在中访问的线程等待,this.notify()是唤醒一个正在当前对象上等待的线程,这里的对象又是什么。谢谢谢谢谢谢 当前对象就是你 this 指向的引用 首先,多线程是并发执行了。执行顺序,有操作系统,根据当前环境和条件来决定。程序员,一般无法获得执行顺序。其次,楼主的代码,只有两个线程在运行。main线程和t线程。synchronized的锁是加在tt对象上的。并且,程序只创建了一个tt对象。那么,tt对象的两个方法,不能同时被多个线程访问,只能逐个访问。main线程调用的m1方法,t线程调用的m2方法。如果m2先调用,m1后调用,输出结果b = 1000如果m1先调用,m2后调用,输出结果b = 1000因为,m2后调用,虽然b的值改了,但,没有输出语句,无法查看。 随机置换问题如何处理?求思路。。。 关于集合的选择 原来exe4j只是在jar包外面装了一层壳,根本提升不了效率 indexOf()方法 为一个类实现了所有接口中的的所有方法任把它声明为抽象类? java远程连接SQL数据库问题 绝对 难题!! 关于文件下载的问题,大家帮个忙!!!! 骨灰级菜鸟的问题! NoClassDefFoundError!!!第一次碰上 关于Java Collection的一些疑惑 java文件怎么不显示java图标?
System.out.println(i);
}
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);
}
}非常不解。谢谢
但既然中间有sleep(5000)这样的语句,基本上可以肯定在睡眠的时候其它线程不会闲着。
从执行顺序来看,这三个线程共同竞争CPU和内存资源,如果tt.m2()这个线程取得资源,优先运行(这个概率很大)那么输出结果可能是2000 b=1000 ,是m2先执行,主进程后执行,t最后执行
还有一种可能是t.start()首先取得资源,执行结果是1000 b=1000,这个顺序是t先执行,主进程后执行,m2线程最后执行,这个概率要小很多,因为t.start()有5秒休息时间
执行顺序,有操作系统,根据当前环境和条件来决定。
程序员,一般无法获得执行顺序。其次,楼主的代码,只有两个线程在运行。main线程和t线程。
synchronized的锁是加在tt对象上的。并且,程序只创建了一个tt对象。
那么,tt对象的两个方法,不能同时被多个线程访问,只能逐个访问。main线程调用的m1方法,t线程调用的m2方法。
如果m2先调用,m1后调用,输出结果b = 1000
如果m1先调用,m2后调用,输出结果b = 1000
因为,m2后调用,虽然b的值改了,但,没有输出语句,无法查看。