线程
JVM允许一个应用有多个线程同时运行
线程有优先级,高优先级线程比低优先级线程优先被执行。线程可以标记成daemon。在线程里创建一个新的线程,这个新线程的初始优先级等于创建线程的优先级。当创建线程是daemon线程时,新线程就是daemon线程。
JVM启动时,通常有一个非daemon线程,有些地方成为main。JVM不停的执行线程,遇到下面情况之一停止:
1 Runtime的exit方法被调用了,并且安全管理允许exit操作发生。
2 所有的非daemon线程已经死了,即run执行结束或者在run抛出了异常。
有2种方式创建线程,一个是声明一个Thread类的子类,并且重写Thread类的run方法。然后子类的实例就可以被分配和启动。另一个是声明一个类实现Runnable接口,这类实现run方法。这个类的实例可以被分配出来,在创建线程的时候作为一个参数被传递,被启动。
线程都有一个作为身份的名称,多个线程可能有同样的名字,如果线程创建的时候没有指定名称,会自动生成一个新的名称。
在线程里的构造函数和方法里传空的参数会导致空指针异常。
线程池
用Executors的工厂方法配置线程池。
线程池解决2个问题:在执行大量异步任务时提供更好的性能,减少了任务前调用的开销;提供一种限制和管理线程的方式。
为方便使用,在Executors中封装了几个方便的工厂方法:newCachedThreadPool(无限制线程池,自动申请线程),newFixedThreadPool(固定线程池),newSingleThreadExecutor