总结: 1. run不新启线程,还在老线程中执行,启动新线程只能start
2. sleep不释放锁,wait释放。</strong></span>
3. synchonrized 使用时最好为synchronized(this) {.....}
package ThreadTest;
public class MockTest {
public static void main(String[] args) {
Test t1 = new Test() ;
Thread tt =new Thread(t1) ;
tt.run() ;
// tt.start() ;
for(int k=0;k<5;k++){
t1.addA() ;
System.out.println(" Main Thread Add a: " +t1.a);
}
}
}
class Test implements Runnable{
public int a = 0 ;
public void run() {
synchronized (this) {
while(a<4){
System.out.println("a<4 " + Thread.currentThread().getName()+"--a..." +a);
try {
Thread.sleep(1000);
// this.wait(1000) ;
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
System.out.println(" a>4...." + Thread.currentThread().getName());
}
public synchronized void addA(){
a++ ;
}
}
有个问题没搞清楚。。。。
1.start()方法来启动线程,真正实现了多线程运行,这时无需等待run方法体代码执行完毕而直接继续执行下面的代码:
通过调用Thread类的start()方法来启动一个线程,
这时此线程是处于就绪状态,
并没有运行。
然后通过此Thread类调用方法run()来完成其运行操作的,
这里方法run()称为线程体,
它包含了要执行的这个线程的内容,
Run方法运行结束,
此线程终止,
而CPU再运行其它线程,
2.run()方法当作普通方法的方式调用,程序还是要顺序执行,还是要等待run方法体执行完毕后才可继续执行下面的代码:
而如果直接用Run方法,
这只是调用一个方法而已,
程序中依然只有主线程--这一个线程,
其程序执行路径还是只有一条,
这样就没有达到写线程的目的。