1. 无论使用哪种方式,最终都必须依靠 Thread 类才能启动多线程。
2. 启动线程是调用 start 方法,而不是调用 run 方法。
3. 同一个线程对象不能 start 2 次,否则将会抛异常:java.lang.IllegalThreadStateException。
4. Thread 类和 Runnable 接口之间在使用上也是有区别的,如果一个类继承了 Thread 类,则不适合于多个线程共享资源,而实现了Runnable 接口,就可以方便地实现资源的共享。
5.
1 MyThread my = new MyThread(); 2 new Thread(my).start(); 3 new Thread(my).start(); 4 new Thread(my).start();
6.
1 MyThread mt1 = new MyThread(); 2 MyThread mt2 = new MyThread(); 3 new Thread(mt1).start(); 4 new Thread(mt2).start();
7. 创建 就绪 运行 阻塞 终止
8. 线程调用 stop() 方法时或 run() 方法执行结束后,即处于死亡状态。处于死亡状态的线程不具有继续运行的能力。
9. currentThread() 是 Thread 的一个静态方法,在你不重写父类 Thread 的这个方法的情况下,此时 this.currentThread 跟 Thread.currentThread 无任何区别。
10. Thread-0
11. Java 运行时,至少会启动两个线程,一个是 main 线程,另一个是垃圾收集线程。
12. 主线程有可能比其他线程先执行完。
13. 主方法的优先级是NORM_PRIORITY。
14. 并非线程的优先级越高就一定会先执行,哪个先执行将由CPU的调度决定。
15.
16. 静态块优于主方法的执行,静态块优于构造块的执行。
17. 访问权限{public|default|protected|private]}[final][static][synchronized]
返回值类型|void 方法名称(参数类型 参数名称)[throws Exception1,]
18. synchronized 标注对象中所有参与同步的代码块,如下代码所示:
1 public synchronized void set(String name, String content){ 2 this.name = name; 3 this.content = content; 4 } 5 public synchronized void get(){ 6 System.out.print(this.name +" "); 7 System.out.print(this.content +" "); 8 }
对于以上的代码,如果一个线程访问这个对象的 set 方法,那么这个对象中的 set 方法的代码块同这个对象的 get 代码块同时被锁住,其他的线程不能访问他们的代码块。
19. 结束线程不最好不要使用stop(),可以使用标志位。
20. run()方法为线程的主体。
21. run方法同我们写的其他的方法实在没有什么不同的方法,所以如果你通过对象调用run方法,按照正常的程序逻辑,自然是调用一次,和线程没有一毛钱关系的,对线程的具体实现是在start方法中进行的,通过相关机制,将run方法中的内容另起炉灶,脱离main方法的线程,自己独立拥有一个线程执行。
22. 实现Runnable接口的类启用线程的方式是借用Thread的方法。