public class TT implements Runnable {
int b = 100;
public synchronized void m1() throws Exception {
b = 1000;
Thread.sleep(5000);
System.out.println("b= "+b);
}
public 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();
}
}
这是源码!
我的问题是:public synchronized void m1() throws Exception {
b = 1000;
Thread.sleep(5000);
System.out.println("b= "+b);
被锁住了
执行的是:
public void m2() throws Exception {
Thread.sleep(2500);
b = 2000;
}这个方法为什么输结果是b= 2000;public void m2() throws Exception {
Thread.sleep(2500);
b = 2000;
}这里面没有打印的语句啊!
int b = 100;
public synchronized void m1() throws Exception {
b = 1000;
Thread.sleep(5000);
System.out.println("b= "+b);
}
public 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();
}
}
这是源码!
我的问题是:public synchronized void m1() throws Exception {
b = 1000;
Thread.sleep(5000);
System.out.println("b= "+b);
被锁住了
执行的是:
public void m2() throws Exception {
Thread.sleep(2500);
b = 2000;
}这个方法为什么输结果是b= 2000;public void m2() throws Exception {
Thread.sleep(2500);
b = 2000;
}这里面没有打印的语句啊!
public static void main(String [] args) throws Exception {
TT tt = new TT();
Thread t = new Thread(tt);
t.start();tt.m2();}
}
这里先执行m2,再执行m1()的可能性比较大。
[code=Java]
public synchronized void m1() throws Exception {
System.out.println("进入m1");
b = 1000;
Thread.sleep(5000);
System.out.println("b= " + b);
}
public void m2() throws Exception {
System.out.println("进入m2");
Thread.sleep(2500);
b = 2000;
}
t.start()执行后,m1()可允许,但是并不一定运行,这是m2和m1都有可能优先执行。
Java多线程是抢占式的。你可以在m1 m2前增加俩打印语句,看看谁先执行。[/code]
哈哈 纯属个人理解~
demopublic class TT implements Runnable {
int b = 100;
boolean isDone;
public synchronized void m1() throws Exception {
while(!isDone);
b = 1000;
Thread.sleep(5000);
System.out.println("b= " + b);
} public void m2() throws Exception {
Thread.sleep(2500);
b = 2000;
isDone = true;
} 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(); }
}
Good Luck.
int b = 100; public synchronized void m1() throws Exception {
System.out.println("m1");
b = 1000;
System.out.println("in m1 sleep before b = " + b);
Thread.sleep(5000);
System.out.println("in m1 sleep after b = " + b);
System.out.println("b= " + b);
} public void m2() throws Exception {
System.out.println("m2");
System.out.println("in m2 sleep before b = " + b);
Thread.sleep(2500);
b = 2000;
System.out.println("in m2 sleep after b = " + b);
} 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(); }
}
基本可以看出执行顺序了。
当猪线程m2方法先执行的时候,休眠2.5秒。此刻线程进入m1方法,继续休眠5秒。
此刻,m2已经休眠完成,将b设置成2000。等到m1休眠完成后自然输出2000.
你可以把m1的sleep时间设置的短点,自然就出现不同的结果。
Thread.sleep(2500);
b= 2000;
}
这里面并没有:System.out.println("b= "+b);
但是,还是打印出来了,我想知道这里是用了面向对象的什么原理!
Thread.sleep(2500);
b= 2000;
}
这里面并没有:System.out.println("b= "+b);
但是,还是打印出来了,我想知道这里是用了面向对象的什么原理!
main->m1->b=1000->m1 sleep->m2 sleep->m2 wake up->b=2000->m1 wake up->m1 print.需要注意的是,m2是在主线程中执行的,一般来说,主线程的优先级是要比子线程高的。不过,线程这个东西,一切皆有可能所以,最终输出结果为1000,也不是完全没有可能。
当猪线程m2方法先执行的时候,休眠2.5秒。此刻线程进入m1方法,继续休眠5秒。
此刻,m2已经休眠完成,将b设置成2000。等到m1休眠完成后自然输出2000.
你可以把m1的sleep时间设置的短点,自然就出现不同的结果。