做了一个线程方面的例子:
public class ThreadInterview implements Runnable{
int b = 10; public synchronized void m1() throws Exception{
b = 3000;
Thread.sleep(2000);
System.out.println(Thread.currentThread().getName()+" b=" + b);
} //public synchronized void m2() throws Exception{
public void m2() throws Exception{
b = 2000; //是这。将它标记为(一)
Thread.sleep(1000);
//b = 2000; //就是这。将它标记为(二)
} public void run(){
try{
m1();
}catch(Exception e){
e.printStackTrace();
}
} public static void main(String[] args) throws Exception {
ThreadInterview TI = new ThreadInterview();
Thread t = new Thread(TI);
t.start(); TI.m2();
System.out.println(Thread.currentThread().getName() + " b=" +TI.b);
} } 以上代码中,如果使用标记(一)处的b=2000, 输出结果是:main b=3000
Thread-0 b=3000 如果使用标记(二)处的b=2000,输出结果是:main b=2000
Thread-0 b=2000 请问:这两处的位置有什么区别吗?为什么出现不一样的结果呢? 还有,sleep()方法不就是休眠当前线程吗。
public class ThreadInterview implements Runnable{
int b = 10; public synchronized void m1() throws Exception{
b = 3000;
Thread.sleep(2000);
System.out.println(Thread.currentThread().getName()+" b=" + b);
} //public synchronized void m2() throws Exception{
public void m2() throws Exception{
b = 2000; //是这。将它标记为(一)
Thread.sleep(1000);
//b = 2000; //就是这。将它标记为(二)
} public void run(){
try{
m1();
}catch(Exception e){
e.printStackTrace();
}
} public static void main(String[] args) throws Exception {
ThreadInterview TI = new ThreadInterview();
Thread t = new Thread(TI);
t.start(); TI.m2();
System.out.println(Thread.currentThread().getName() + " b=" +TI.b);
} } 以上代码中,如果使用标记(一)处的b=2000, 输出结果是:main b=3000
Thread-0 b=3000 如果使用标记(二)处的b=2000,输出结果是:main b=2000
Thread-0 b=2000 请问:这两处的位置有什么区别吗?为什么出现不一样的结果呢? 还有,sleep()方法不就是休眠当前线程吗。
解决方案 »
- syslog4j发送中英字符窜问题
- Hash HashMap
- 关于Java向sql2000插入数据的代码问题
- JScrollBar的问题。
- 给定一段字符串,其中有a-Z的52个字母组成,其中单词是靠回车或制表符或空格分割,请统计这段文件中有多少个单词
- 新手求助~请各位熟悉JGraph的高人入内,求教如何将JGraph生成的图导出为JPG或其他图片文件?
- 产生OutofMemoryError: Java heap space 异常的一段代码
- 关于操作系统和JDK,JRE的版本问题
- 有没有什么命令使命令提示符里面的内容从中文变成英文?
- 老是出现同样的错误!急死了!在线等!
- 沒有看到執行strSql 數據庫代碼??
- 怎么用接口实现多继承??
我们所谓设置的sleep,是指cpu执行这个线程的时候,到sleep这一句,让线程休眠
所以,不能说通过设置sleep的时间就能完全控制线程执行的顺序
线程启动是需要开销的,而再启动新的线程这段时间里,main线程已经运行到了TI.m2();
从而先调用了
b = 2000; //是这。将它标记为(一)
然后休眠
这时候新的线程启动,调用 b = 3000; 此时b已经变为了3000,然后main线程休眠
从而得到了楼主的结果而//b = 2000; //就是这。将它标记为(二) 这里,main休眠,此时新的线程运行,
调用b=3000,然后休眠,然后main线程运行,b=2000被调用。此时,b就是2000呵呵,为了证明以上的推测
改了下程序
public class TestThread implements Runnable {
int b = 10; public synchronized void m1() throws Exception {
b = 3000;
Thread.sleep(2000);
System.out.println(Thread.currentThread().getName() + " b=" + b);
} // public synchronized void m2() throws Exception{
public void m2() throws Exception {
b = 2000; // 是这。将它标记为(一)
Thread.sleep(1000);
//b = 2000; //就是这。将它标记为(二)
} public void run() {
try {
m1();
} catch (Exception e) {
e.printStackTrace();
}
} public static void main(String[] args) throws Exception {
TestThread TI = new TestThread();
Thread t = new Thread(TI);
t.start(); for( int i = 0; i <10000; i++ )
;
TI.m2();
System.out.println(Thread.currentThread().getName() + " b=" + TI.b);
}}
楼主可以这样运行下代码看看,就明白了