日期:2014-05-20  浏览次数:20735 次

关于多线程的疑惑。
最近在学多线程,很多疑惑:
1:notify:
加入有200个线程那么notify是随机唤醒一个还是?
2:notyfyALL:
同样200个线程处于wait,唤醒所有只的是除了自己以外的其他全部吗?
3:wait:
当前线程调用wait后之后后面的代码不执行?被唤醒后是从wait后执行还是重新开始之前的执行同步块,
4:synchronized跟run:如:
main{
ThreadB b=new ThreadB();
    b.start();
    System.out.println("b is start....");
    synchronized(this){...}

}
class ThreadB extends Thread{.
run{...}..
}

这样,他是先执行那个,貌似不确定的感觉,是主线程main先开始还是子线程b先开始,那个先执行,如果不确定的话又是为啥不确定的;

例子:
之前在别人那里看到的:
/**
 * 
 */

public class TT implements Runnable {
int b = 100;
public synchronized void m1() throws Exception {
b = 1000;
Thread.sleep(10);
System.out.println("b = " + b);
}

public synchronized void m2() throws Exception {
Thread.sleep(4500);
b = 2000;
System.out.println(b);
Thread.sleep(500);
}

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("a =" + tt.b);

}

}

这个是那个为啥是tt.m2();先执行,跟着System.out.println("a =" + tt.b);其次才是t.start();    tt.m2();这个先执行后我把休眠时间设置再大也是System.out.println("a =" + tt.b);在t.start();之前先输出,这又是为啥?
多线程

------解决方案--------------------
最近在学多线程,很多疑惑:
1:notify:
加入有200个线程那么notify是随机唤醒一个还是?
随机一个。

2:notyfyALL:
同样200个线程处于wait,唤醒所有只的是除了自己以外的其他全部吗?
恩。

3:wait:
当前线程调用wait后之后后面的代码不执行?被唤醒后是从wait后执行还是重新开始之前的执行同步块,
wait后执行。

4:synchronized跟run:如:
main{
ThreadB b=new ThreadB();
    b.start();
    System.out.println("b is start....");
    synchronized(this){...}