UML中规定的箭头方向是从子类指向父类。
关于这一点,按照以下方法去理解有助于大家记住这条规则。
在定义子类时需要通过extends关键字指定父类。因此,
子类一定要知道父类的定义,而反过来,父类并不知道子类的定义。
只有在知道对方的信息时才能指向对方,因此箭头方向是从子类指向父类。
Timethreads图能够将线程的运行可视化。
Thread类中的start方法主要执行以下 几个操作:
1.启动新线程
2.调用run方法
启动线程的两种方法:
1.利用Thread类的子类的实例启动线程。
2.利用Runnable接口的实现类的实例启动线程。
public interface Runnable{
public abstract void run();
}
Runnable接口的实现类必须要实现run方法。
由于Printer类实现implements了Runnable接口,
所以此时也就无需再将Printer类声明为Thread类的子类。
创建Runnable接口的实现类,将实现类的实例作为参数传给
Thread的构造函数,调用start方法---这就是利用Runnable接口
启动线程的方法。不管是利用Thread类的子类方法,
还是利用Runnable接口的实现类的方法,启动新线程的方法
最终都是Thread类的start方法。
java.util.concurrent.ThreadFactory中的线程创建
java.util.concurrent包中包含一个线程创建
抽象化的ThreadFactory接口。利用该接口,
我们可以将以Runnable作为传入参数并通过new创建
Thread实例的处理隐藏再ThreadFactory内部。
assert Thread.holdLock(obj);
当前线程是否已获取某一对象的锁可以通过。