Java并发编程-上

来源:互联网 发布:语音读书软件 编辑:程序博客网 时间:2024/05/09 00:35

一、线程

1 线程的创建

创建线程通常有两种方法: 1) 扩展Thread类实现线程的创建是最常用也是最直接的一种方法,通过继承类Thread实现线程体;2) 通过实现Runnable接口实现线程体。

2 Thread类的几种构造函数

    1) Thread()

    2) Thread(Runnable target)

    3) Thread(Runnable target,String name)

    4) Thread(String name)

    5) Thread(ThreadGroup group,Runnable target)

    6) Thread(ThreadGroup group,Runnable target,String name)

    7) Thread(ThreadGroup group,String name)

3 Thread类的成员变量及其含义

    1) static int MAX_PRIORITY: 线程可以用于的最大优先级

    2) static int MIN_PRIORITY: 线程可以用于的最小优先级

    3) static int NORM_PRIORITY: 线程可以用于的默认优先级

4 Thread类的函数变量及其含义

    1) static int activeCount(): 返回当前线程组中活动线程的个数

    2) static Thread currentThread(): 返回当前线程的对象引用

    3void destroy(): 结束线程的运行

    4) String getName():返回当前线程的名称

    5) int getPriority():返回当前线程的优先级

    6) void interrupt(): 中断当前线程的运行

    7) ThreadGroup get ThreadGroup: 返回当前线程所属线程组

    8) static boolean interrupted(): 测试当前线程是否被中断

    9) boolean isAlive(): 测试当前线程是否正在运行

    10) boolean isDaemon(): 测试当前线程是否为守护线程

    11) boolean isInterrupted():测试当前线程是否被中断

    12) void resume(): 恢复线程的运行

    13) void run(): 启动线程

    14) void setDaemon(): 设置线程为守护线程

    15) void setName(String name): 设置线程的名称

    16) void setPriority():设置线程的优先级

    17) static void sleep(long millis): 令线程休眠millis毫秒

    18) static void sleep(long millis,int nanos):令线程休眠millis毫秒加nanos纳秒

    19) void start(): 启动线程的运行(run是有区别的)

    20) void suspend():挂起线程

    21) static void yield():线程退出执行,进入就绪队列

二、线程的基本控制流程

    创建线程后可以执行start()函数启动线程,根据线程任务的特性及线程之间的协调性要求需要对线程加以控制。对线程的控制通常是通过调用Thread对象的方法来实现的,主要有sleepsuspendresumejoininterruptstop等,且这些方法的调用通常会引起线程的状态变化。

 

1 sleep()暂停执行线程

    Thread.sleep()使当前线程暂停一段时间,它将释放CPU资源使其他线程或进程使用处理器(:CPU外的资源将保留)它有两个重载版本,一个指定睡眠时间以毫秒为单位,另一个则指定以纳秒为单位。它可以抛出InterruptedException异常,可以被中断Interupt终止。

2 join()等待另外一个线程结束

    两个Thread对象t1t2,在t1中调用了t2.join()会导致线程t1暂停执行直到t2终止,其重载版本允许指定等待的时间。

3 Interrupt()中断线程

    线程的终止可以有三种方法实现:1) run()方法正常返回;2) run()方法外以外结束;3) 应用程序终止。中断不会强制终止线程,但却可以中断线程的休眠状态。这样一来,在线程终止之前,线程自己能够检查自己状态,再做些清理工作之后结束线程(线程的中断状态只能自己清除),这使得它比stop更合理。与中断线程有关的函数有:

    interrupt: 向线程发送中断请求。

    isInterrupted: 测试线程是否被中断。

    Interrupted: 测试当前线程是否被中断,随后清除线程中断状态的静态方法。

[]: 如果被中断的线程正在执行sleepwait方法,则异常InterruptedException将会被抛出,这种抛出异常的中断会清除线程的中断状态。

[另注]: 通常情况下,执行阻塞操作的方法都应该通过Interrupt来取消阻塞操作。

[再注]: 通常情况下,如果一个线程长时间没有调用能够抛出InterruptedException的方法,那么它将必须定期调用Thread.interrupted方法,若返回值为true则退出线程。

4 stop()终止线程

    该方法强制终止当前线程,并创建一个ThreadDeath对象作为异常。通常,应用程序不应当捕获ThreadDeath,除非它必须执行某些异常的清除工作(抛出ThreadDeath将导致try语句的finally子句在线程正式结束前被执行),如果捕获了一个ThreadDeath,则重新抛出该对象才会使线程真正地结束。

 

三、程序的结束

   每一个程序都至少有一个主线程main,如果没有其他的线程,则main方法返回时整个程序也结束了。如果还有其他线程,情况就发生了不同。

    线程主要有用户线程和守护线程,用户线程可以保持程序处于运行状态,而守护线程则不会。当用户线程结束时,所有的守护线程都会被强行终止,随后便结束整个程序。若含多线程的程序,若想在初始线程结束时就结束整个应用程序,则将其余的所有线程设置为守护线程(setDaemon)是个很好的办法。

    当然,也可以调用System或者Runtimeexit方法来强制结束应用程序,它将终止java虚拟机的当前执行过程。

 

四、 线程池

<>、使用JDK线程池创建线程主要分为三步:

    1 第一步: 创建线程目标对象,可以是不同的。

    2 第二步: 使用Execuors创建线程池,返回一个ExecutorService类型的对象。

    3 第三步: 使用线程池执行线程目标对象exec.execute(run),最后,结束线程池中的线程exec.shutdown()

 

<>、创建线程池的几种函数

    API: java.lang.concurrent.Executors extends Object

该类主要定义了一些工厂方法和工具方法,其中最主要的是创建各种线程池。

 

1 public static ExecutorService newFixedThreadPool(int nThread)

    创建一个可重用固定数量的线程池,以共享的无界队列方式来运行这些线程,在需要时使用提供的ThreadFactory创建新线程,在任意点,大多数线程会处于活动状态。如果在所有线程处于活动状态时提交附加任务,附加任务将被加入等待队列之中,直到可用线程出现。任何线程如果由于异常提前终止,则一个新线程将代替它执行后续的任务。

    []: 任何线程在被显示关闭之前,池中的线程将会一直存在。

2 public static ThreadFactory defaultThreadFactory()

    返回一个用于创建新线程的默认线程工厂,此工厂创建同一个线程组中Executor使用的新线程。如果有SecurityManager,则它将使用System.getSecurityManager()返回的组,否则将使用defaultThreadFactory方法的组。其中,每个线程都为非守护线程,能设置线程优先级为Thread.NORM_PRIORITY,能设置线程组中允许的最大优先级的最小。

3 public static ExecutorService newCachedThreadPool()

    创建一个可以根据需要新建线程的线程池,超过60秒处于闲置状态的线程将会被移除缓存。调用exeute之前构造的线程在需要时可以重用,当没有现成可用之时,可以新建线程。

4 public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize)

    创建一个线程池,可以在给定延迟后运行,也可以定期地执行。

5 void execute(Runnable command)

    在未来某个给定的时间执行给定的命令,该命令可以在新的线程、已入池的线程、正被调用的线程中执行,这由executor决定。

6 void shutdown()

    启动一次顺序关闭,执行以前提交的任务而不接受新任务。如果已经关闭,则该命令无任何作用。

 

Reference:

[1] 刘晓华等<<Java核心技术>>

[2] <<Java并发编程>>

[3] Java.Fan.net <<Java线程>>

原创粉丝点击