PDF 课件和源代码下载地址:
https://gitee.com/geektime-geekbang/LetsJava
作者回复: 因为CONTENTS的add方法不是线程安全的。如果两个thred都在执行add方法的代码,就有可能乱套。
作者回复: 前者的方法是同步的,后者没有
作者回复: 具体要根据任务特征调整。参考值是CPU核数-1,如果是io密集型可以多加。
作者回复: 下面是Thread里start方法的注释。 注意到“The result is that two threads are running concurrently” 所以start方法返回之后,线程是保证已经启动运行了的。 所以调用start方法,返回之后就可以调用join了。sleep1ms只是一个程序员的多疑。 /** * Causes this thread to begin execution; the Java Virtual Machine * calls the <code>run</code> method of this thread. * <p> * The result is that two threads are running concurrently: the * current thread (which returns from the call to the * <code>start</code> method) and the other thread (which executes its * <code>run</code> method). * <p> * It is never legal to start a thread more than once. * In particular, a thread may not be restarted once it has completed * execution. * * @exception IllegalThreadStateException if the thread was already * started. * @see #run() * @see #stop() */ public synchronized void start() {
作者回复: 执行到这一行代码的线程等
作者回复: 嗯呐
作者回复: 是但好像也不完全是😂
作者回复: 主线程其实就是一个普通的线程,没有什么特殊的逻辑。 thread1.join() 首先这是一行代码,执行这行代码的不能是thread1,而是其它的线程比如说是thread2,那就是thread2等着thread1执行结束。
作者回复: 是的,这个其实就是实现了Runnable接口。这个接口只有一个方法,可以用lambda代替。这个方法没有参数也没有返回值,所以就这么写就可以了。
作者回复: die了就消失了,跟踪是指的跟踪什么?