最近在学多线程,很多疑惑:
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后执行还是重新开始之前的执行同步块,
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){...}}
class ThreadB extends Thread{.
run{...}..
}这样,他是先执行那个,貌似不确定的感觉,是主线程main先开始还是子线程b先开始,那个先执行,如果不确定的话又是为啥不确定的;主线程先开始,无论如何都是主线程先开始,因为主线程不开始,其他线程就没办法开始。貌似是synchronized没有什么关系。例子:
之前在别人那里看到的:
/**
*
*/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);}}
????
main方法体属于一个线程,其他的线程也是线程。必须所有具有输出的线程停止之后,程序才会停止输出。
“main方法体属于一个线程,其他的线程也是线程。必须所有具有输出的线程停止之后,程序才会停止输出”:加入main线程里面有2个线程,那意思是说main线程可以在其他线程之前先停,之后的线程也可以输出,可以不在main现在之前先停止?这这样吗?
对于你的第一个问题,首先,Java中线程的状态你必须知道,某个线程使用wait后,释放对象锁,然后这个线程进入wait状态,对于notify,官方文档说的是随机唤醒处于wait中的一个线程,而notifyAll唤醒所有处于wait状态的线程。然后进入block状态,这个状态不是由于I/O造成的block状态,而是由于对象锁,然后这些被唤醒的线程和其他线程一起竞争这个锁,都是公平待遇。待续
“main方法体属于一个线程,其他的线程也是线程。必须所有具有输出的线程停止之后,程序才会停止输出”:加入main线程里面有2个线程,那意思是说main线程可以在其他线程之前先停,之后的线程也可以输出,可以不在main现在之前先停止?这这样吗?是的。线程之间,彼此是平等的。一般不存在某个线程停止了,其他线程也必须停止的问题。
(当然,人为的原因除外)
http://www.lantaozi.com/article/52209f4b6836415678000001
“main方法体属于一个线程,其他的线程也是线程。必须所有具有输出的线程停止之后,程序才会停止输出”:加入main线程里面有2个线程,那意思是说main线程可以在其他线程之前先停,之后的线程也可以输出,可以不在main现在之前先停止?这这样吗?是的。线程之间,彼此是平等的。一般不存在某个线程停止了,其他线程也必须停止的问题。
(当然,人为的原因除外)主线程先开始,执行就不一定了?