62,629
社区成员
发帖
与我相关
我的任务
分享 public final synchronized void join(long millis)
throws InterruptedException {
long base = System.currentTimeMillis();
long now = 0;
if (millis < 0) {
throw new IllegalArgumentException("timeout value is negative");
}
if (millis == 0) {
while (isAlive()) {
wait(0); //wait不应该是this.wait()吗,如果主线程中有t.join(),那么这里不应该是t.wait()吗?
}
} else {
while (isAlive()) {
long delay = millis - now;
if (delay <= 0) {
break;
}
wait(delay);
now = System.currentTimeMillis() - base;
}
}
}
public class JoinDemo {
private static int a = 0;
public static void main(String[] args) throws InterruptedException {
Thread t = new Thread(new Runnable() {
@Override
public void run() {
for (int k = 0; k < 5; k++) {
a = a + 1;
}
}
});
t.start();
t.join();
System.out.println(a);
}
}
就是说在main中的Thread t对象的方法调用都可以看成是main线程在调用这个方法,这样理解对吗?那么如果main中有t.start()、t.join()、t.wait()都看成是主线程在调用这些方法,这样就不对了。。。感觉我不是很理解。。。还是说是只是wait()方法比较特殊,线程对象t 在main中调用t.wait()就相当于主线程调用普通方法???麻烦您再解释一下吧
[/quote]
那么如果main中有t.start()、t.join()、t.wait()都看成是主线程在调用这些方法,这样就不对了。。。
这有什么不对的,这些方法明明就是在主线程里面调用的啊,把线程对象当Object就行了[/quote]
按照”主线程调用t.wait()就是主线程执行wait()”这种思路,那么主线程调用t.start()、t.join()也是主线程执行start()、join(),这样明显就不对了呀,这两个方法应当还是线程t执行 的不是吗[/quote]
都是主线程调用的,建议你多看看线程相关的书,
这是对start方法的解释
主线程调用start方法,start方法中调用native的start0方法,start0方法调用JVM_StartThread方法,
JVM_StartThread方法中有这样的调用:
..........
native_thread = new JavaThread(&thread_entry, sz);
...........
Thread::start(native_thread);
这次是真正的开启了一个线程.
新开启的线程执行以下方法:
static void thread_entry(JavaThread* thread, TRAPS) {
HandleMark hm(THREAD);
Handle obj(THREAD, thread->threadObj());
JavaValue result(T_VOID);
JavaCalls::call_virtual(&result,obj,
KlassHandle(THREAD,SystemDictionary::Thread_klass()),
vmSymbolHandles::run_method_name(), //这里执行的是线程中重写的run方法
vmSymbolHandles::void_method_signature(),THREAD);
}
这是对join方法的解释:
private static int a = 0;
public static void main(String[] args) throws InterruptedException {
final Object o = new Object();
Thread t = new Thread(new Runnable() {
@Override
public void run() {
for (int k = 0; k < 100000; k++) {
a = a + 1;
}
synchronized (o) {
o.notify();
}
}
});
t.start();
synchronized (o) {
o.wait(0);
}
System.out.println(a);
}
你给出的方法和这个方法是等价的,只不过是没有用线程对象的join方法,但是两个的思想和运行结果完全是等价的.
那为什么要用t.join呢,因为jdk帮你封装了我给出的代码,简化了编程,线程终结时会调用t.notify而不用你自己像我那样手动的唤醒线程了[/quote]
线程这方面的知识我得好好补补了,谢谢了
就是说在main中的Thread t对象的方法调用都可以看成是main线程在调用这个方法,这样理解对吗?那么如果main中有t.start()、t.join()、t.wait()都看成是主线程在调用这些方法,这样就不对了。。。感觉我不是很理解。。。还是说是只是wait()方法比较特殊,线程对象t 在main中调用t.wait()就相当于主线程调用普通方法???麻烦您再解释一下吧
[/quote]
那么如果main中有t.start()、t.join()、t.wait()都看成是主线程在调用这些方法,这样就不对了。。。
这有什么不对的,这些方法明明就是在主线程里面调用的啊,把线程对象当Object就行了[/quote]
按照”主线程调用t.wait()就是主线程执行wait()”这种思路,那么主线程调用t.start()、t.join()也是主线程执行start()、join(),这样明显就不对了呀,这两个方法应当还是线程t执行 的不是吗
就是说在main中的Thread t对象的方法调用都可以看成是main线程在调用这个方法,这样理解对吗?那么如果main中有t.start()、t.join()、t.wait()都看成是主线程在调用这些方法,这样就不对了。。。感觉我不是很理解。。。还是说是只是wait()方法比较特殊,线程对象t 在main中调用t.wait()就相当于主线程调用普通方法???麻烦您再解释一下吧
[/quote]
那么如果main中有t.start()、t.join()、t.wait()都看成是主线程在调用这些方法,这样就不对了。。。
这有什么不对的,这些方法明明就是在主线程里面调用的啊,把线程对象当Object就行了
就是说在main中的Thread t对象的方法调用都可以看成是main线程在调用这个方法,这样理解对吗?那么如果main中有t.start()、t.join()、t.wait()都看成是主线程在调用这些方法,这样就不对了。。。感觉我不是很理解。。。还是说是只是wait()方法比较特殊,线程对象t 在main中调用t.wait()就相当于主线程调用普通方法???麻烦您再解释一下吧
[/quote]
那么如果main中有t.start()、t.join()、t.wait()都看成是主线程在调用这些方法,这样就不对了。。。
这有什么不对的,这些方法明明就是在主线程里面调用的啊,把线程对象当Object就行了[/quote]
按照”主线程调用t.wait()就是主线程执行wait()”这种思路,那么主线程调用t.start()、t.join()也是主线程执行start()、join(),这样明显就不对了呀,这两个方法应当还是线程t执行 的不是吗[/quote]
都是主线程调用的,建议你多看看线程相关的书,
这是对start方法的解释
主线程调用start方法,start方法中调用native的start0方法,start0方法调用JVM_StartThread方法,
JVM_StartThread方法中有这样的调用:
..........
native_thread = new JavaThread(&thread_entry, sz);
...........
Thread::start(native_thread);
这次是真正的开启了一个线程.
新开启的线程执行以下方法:
static void thread_entry(JavaThread* thread, TRAPS) {
HandleMark hm(THREAD);
Handle obj(THREAD, thread->threadObj());
JavaValue result(T_VOID);
JavaCalls::call_virtual(&result,obj,
KlassHandle(THREAD,SystemDictionary::Thread_klass()),
vmSymbolHandles::run_method_name(), //这里执行的是线程中重写的run方法
vmSymbolHandles::void_method_signature(),THREAD);
}
这是对join方法的解释:
private static int a = 0;
public static void main(String[] args) throws InterruptedException {
final Object o = new Object();
Thread t = new Thread(new Runnable() {
@Override
public void run() {
for (int k = 0; k < 100000; k++) {
a = a + 1;
}
synchronized (o) {
o.notify();
}
}
});
t.start();
synchronized (o) {
o.wait(0);
}
System.out.println(a);
}
你给出的方法和这个方法是等价的,只不过是没有用线程对象的join方法,但是两个的思想和运行结果完全是等价的.
那为什么要用t.join呢,因为jdk帮你封装了我给出的代码,简化了编程,线程终结时会调用t.notify而不用你自己像我那样手动的唤醒线程了
就是说在main中的Thread t对象的方法调用都可以看成是main线程在调用这个方法,这样理解对吗?那么如果main中有t.start()、t.join()、t.wait()都看成是主线程在调用这些方法,这样就不对了。。。感觉我不是很理解。。。还是说是只是wait()方法比较特殊,线程对象t 在main中调用t.wait()就相当于主线程调用普通方法???麻烦您再解释一下吧