你如何确保main()方法所在的线程是Java 程序最后结束的线程?
我们可以使用Thread 类的join()方法来确保所有程序创建的线程在main()方法退出前结束。
线程之间是如何通信的?
当线程间是可以共享资源时,线程间通信是协调它们的重要的手段。Object 类中wait()\notify()\notifyAll()方法可以用于线程间通信关于资源的锁的状态。
为什么线程通信的方法wait(), notify()和notifyAll()被定义在Object 类里?
Java 的每个对象中都有一个锁(monitor,也可以成为监视器) 并且wait(),notify()等方法用于等待对象的锁或者通知其他线程对象的监视器可用。在Java 的线程中并没有可供任何对象使用的锁和同步器。这就是为什么这些方法是Object 类的一部分,这样Java 的每一个类都有用于线程间通信的基本方法。
为什么wait(), notify()和notifyAll ()必须在同步方法或者同步块中被调用?
当一个线程需要调用对象的wait()方法的时候,这个线程必须拥有该对象的锁,接着它就会释放这个对象锁并进入等待状态直到其他线程调用这个对象上的notify()方法。同样的,当一个线程需要调用对象的notify()方法时,它会释放这个对象的锁, 以便其他在等待的线程就可以得到这个对象锁。由于所有的这些方法都需要线程持有对象的锁,这样就只能通过同步来实现, 所以他们只能在同步方法或者同步块中被调用。
为什么Thread 类的sleep()和yield ()方法是静态的?
Thread 类的sleep()和yield()方法将在当前正在执行的线程上运行。所以在其他处于等待状态的线程上调用这些方法是没有意义的。这就是为什么这些方法是静态的。它们可以在当前正在执行的线程中工作,并避免程序员错误的认为可以在其他非运行线程调用这些方法。
如何确保线程安全?
在Java 中可以有很多方法来保证线程安全——同步,使用原子类(atomicconcurrent classes),实现并发锁,使用volatile 关键字, 使用不变类和线程安全类。