结果如下:
InnerThread1: 5
InnerThread2: 5
InnerRunnable1: 5
InnerRunnable2: 5
InnerThread1: 4
ThreadMethod: 5
InnerRunnable1: 4
InnerRunnable2: 4
InnerThread1: 3
ThreadMethod: 4
InnerRunnable1: 3
InnerRunnable2: 3
InnerThread1: 2
ThreadMethod: 3
InnerRunnable1: 2
InnerRunnable2: 2
InnerThread1: 1
ThreadMethod: 2
InnerRunnable1: 1
InnerRunnable2: 1
ThreadMethod: 1
InnerThread2: 4
InnerThread2: 3
InnerThread2: 2
InnerThread2: 1
InnerThread2: 5
InnerRunnable1: 5
InnerRunnable2: 5
InnerThread1: 4
ThreadMethod: 5
InnerRunnable1: 4
InnerRunnable2: 4
InnerThread1: 3
ThreadMethod: 4
InnerRunnable1: 3
InnerRunnable2: 3
InnerThread1: 2
ThreadMethod: 3
InnerRunnable1: 2
InnerRunnable2: 2
InnerThread1: 1
ThreadMethod: 2
InnerRunnable1: 1
InnerRunnable2: 1
ThreadMethod: 1
InnerThread2: 4
InnerThread2: 3
InnerThread2: 2
InnerThread2: 1
第一个InnerThread1类里面创建了一个内部类,在InnerThread1的构造函数里构建了这个内部类,其实我们往往只是希望某一个对象具有线程的功能,因此单独构造一个继承Thread类的类是不是有这个必要是值得商榷的。所以我们有了第二个类的做法了,我们在InnerThread2的构造函数里建立了一个匿名内部类,他继承了Thread,这样我们既让自定义的类具有了线程的功能,又隐藏了不必要的细节,这种做法更合理了。至于第三个和第四个类是换了Runnable来实现同样的功能,但是看起来比较繁琐哈。而ThreadMethod类展示了如何在方法内部创建线程,这种做法的应用场景是,一个类主干可能不需要多线程的,但是它的某个功能可能需要多线程,那么把线程放到方法里是很有必要的,这种方法很值得推广,我们将线程的功能精确到方法级别也许会让我们的程序更加好控制也更加的健壮。
线程的基础篇上篇内容结束了,下一篇我将讲多线程共享资源的问题。