线程 是程序中的执行线程。java 虚拟机允许应用程序并发地运行多个执行线程。
每个线程都有一个优先级,高优先级线程的执行优先于低优先级线程。每个线程都可以或不可以标记为一个守护程序。当某个线程中运行的代码创建一个新 Thread
对象时,该新线程的初始优先级被设定为创建线程的优先级,并且当且仅当创建线程是守护线程时,新线程才是守护程序。
当 Java 虚拟机启动时,通常都会有单个非守护线程(它通常会调用某个指定类的 main
方法)。Java 虚拟机会继续执行线程,直到下列任一情况出现时为止:
Runtime
类的 exit
方法,并且安全管理器允许退出操作发生。 非守护线程的所有线程都已停止运行,无论是通过从对 run 方法的调用中返回,还是通过抛出一个传播到 run
方法之外的异常。 创建新执行线程有两种方法。
一种方法是将类声明为 Thread
的子类。该子类应重写 Thread
类的 run
方法。接下来可以分配并启动该子类的实例。
class PRimeThread extends Thread {long minPrime;PrimeThread(long minPrime) {this.minPrime = minPrime;}public void run() {// compute primes larger than minPrime. . .}}PrimeThread p = new PrimeThread(143);p.start();
另一种方法是声明实现 Runnable
接口的类。该类然后实现 run
方法。然后可以分配该类的实例,在创建Thread
时作为一个参数来传递并启动。
java.lang.Runnable可为那些欲实现任务的类定义一个无参的run()方法-(public interface run();),通过实例化某个 Thread
实例并将自身作为运行目标,就可以运行实现 Runnable
的类而无需创建 Thread
的子类。
class PrimeRun implements Runnable { long minPrime; PrimeRun(long minPrime) { this.minPrime = minPrime; } public void run() { // compute primes larger than minPrime . . . } } PrimeRun p = new PrimeRun(143); new Thread(p).start(); Thread中:yield():void -暂停当前线程,让出cpu资源sleep(millis:long):void-让线程睡眠一段时间,这个方法可能抛出InterruptedException异常,表示期间interrupt()方法被调用,采用try-catch解决jion():void-等待此线程结束后,继续执行。如:在thread1环境中调用thread2.join();只有thread2结束后thread1才继续执行。java.lang.Thread中类static字段中MAX_PRIORITY(10),MIN_PRIORITY(1),NORM_PRIORITY表示为Thread的优先级。
注意:Jvm总是优先运行Priority大的
ThreadPool
线程池(threadPool)用于管理并发执行任务个数的解决办法,java提供java.util..concurrent.Executor接口来执行线程池中任务,提供ExecutorService接口管理任务。
通过Execytors的静态方法创建Executor对象
newFixedThreadPool
public static ExecutorService newFixedThreadPool(int nThreads)创建一个可重用固定线程数的线程池,以共享的无界队列方式来运行这些线程。在任意点,在大多数 nThreads 线程会处于处理任务的活动状态。如果在所有线程处于活动状态时提交附加任务,则在有可用线程之前,附加任务将在队列中等待。如果在关闭前的执行期间由于失败而导致任何线程终止,那么一个新线程将代替它执行后续的任务(如果需要)。在某个线程被显式地关闭
之前,池中的线程将一直存在。参数:nThreads
- 池中的线程数 返回:新创建的线程池 抛出:IllegalArgumentException
- 如果nThreads <= 0newCachedThreadPool
public static ExecutorService newCachedThreadPool()创建一个可根据需要创建新线程的线程池,但是在以前构造的线程可用时将重用它们。对于执行很多短期异步任务的程序而言,这些线程池通常可提高程序性能。调用execute 将重用以前构造的线程(如果线程可用)。如果现有线程没有可用的,则创建一个新线程并添加到池中。终止并从缓存中移除那些已有 60 秒钟未被使用的线程。因此,长时间保持空闲的线程池不会使用任何资源。注意,可以使用ThreadPoolExecutor
构造方法创建具有类似属性但细节不同(例如超时参数)的线程池。 返回:新创建的线程池ExecutorService中:
shutdown():void-关闭执行器,不能接受新任务,但可完成现有任务。shutdownNow():List<Runnable>-关闭且结束返回未完成任务的清单isTerminated():boolean-判断执行器中任务是否都终止了
注意:为少量任务创建线程用Thread类,多个则采用ThreadPool
新闻热点
疑难解答