首页 > 编程 > Java > 正文

Java多线程机制(学习笔记一)

2019-11-08 03:04:47
字体:
来源:转载
供稿:网友

线程 是程序中的执行线程。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 <= 0

newCachedThreadPool

public static ExecutorService newCachedThreadPool()创建一个可根据需要创建新线程的线程池,但是在以前构造的线程可用时将重用它们。对于执行很多短期异步任务的程序而言,这些线程池通常可提高程序性能。调用execute 将重用以前构造的线程(如果线程可用)。如果现有线程没有可用的,则创建一个新线程并添加到池中。终止并从缓存中移除那些已有 60 秒钟未被使用的线程。因此,长时间保持空闲的线程池不会使用任何资源。注意,可以使用ThreadPoolExecutor 构造方法创建具有类似属性但细节不同(例如超时参数)的线程池。 返回:新创建的线程池

ExecutorService中:

shutdown():void-关闭执行器,不能接受新任务,但可完成现有任务。shutdownNow():List<Runnable>-关闭且结束返回未完成任务的清单

isTerminated():boolean-判断执行器中任务是否都终止了

注意:为少量任务创建线程用Thread类,多个则采用ThreadPool


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表