java

位置:IT落伍者 >> java >> 浏览文章

java线程简介(无处不在的线程)


发布日期:2018年09月03日
 
java线程简介(无处不在的线程)

谁创建线程?

即使您从未显式地创建一个新线程您仍可能会发现自己在使用线程线程被从各种来源中引入到我们的程序中

有许多工具可以为您创建线程如果要使用这些工具应该了解线程如何交互以及如何防止线程互相干扰

AWT 和 Swing

任何使用 AWT 或 Swing 的程序都必须处理线程AWT 工具箱创建单个线程用于处理 UI 事件任何由 AWT 事件调用的事件侦听器都在 AWT 事件线程中执行

您不仅必须关心同步对事件侦听器和其它线程之间共享的数据项的访问而且还必须找到一种方法让由事件侦听器触发的长时间运行任务(如在大文档中检查拼写或在文件系统中搜索一个文件) 在后台线程中运行这样当该任务运行时UI 就不会停滞了(这可能还会阻止用户取消操作)这样做的一个好的框架示例是 SwingWorker 类

AWT 事件线程并不是守护程序线程这就是通常使用 Systemexit() 结束 AWT 和 Swing 应用程序的原因

使用 TimerTask

JDK TimerTask 工具被引入到 Java 语言这个便利的工具让您可以稍后在某个时间执行任务(例如即从现在起十秒后运行一次任务)或者定期执行任务(即每隔十秒运行任务)

实现 Timer 类非常简单它创建一个计时器线程并且构建一个按执行时间排序的等待事件队列

TimerTask 线程被标记成守护程序线程这样它就不会阻止程序退出

因为计时器事件是在计时器线程中执行所以必须确保正确同步了针对计时器任务中使用的任何数据项的访问

在 CalculatePrimes 示例中并没有让主线程休眠我们可以使用 TimerTask方法如下

    public static void main(String[] args) {

        Timer timer = new Timer();

        

        final CalculatePrimes calculator = new CalculatePrimes();

        calculatorstart();

        timerschedule(

                new TimerTask() {

                    public void run()

                    {

                        calculatorfinished = true;

                    }

                } TEN_SECONDS);

    }

         

servlet 和 JavaServer Pages 技术

servlet 容器创建多个线程在这些线程中执行 servlet 请求作为 servlet 编写者您不知道(也不应该知道)您的请求会在什么线程中执行如果同时有多个对相同 URL 的请求入站那么同一个 servlet 可能会同时在多个线程中是活动的

当编写 servlet 或 JavaServer Pages (JSP) 文件时必须始终假设可以在多个线程中并发地执行同一个 servlet 或 JSP 文件必须适当同步 servlet 或 JSP 文件访问的任何共享数据这包括 servlet 对象本身的字段

实现 RMI 对象

RMI 工具可以让您调用对在其它 JVM 中运行的对象进行的操作当调用远程方法时RMI 编译器创建的 RMI 存根会打包方法参数并通过网络将它们发送到远程系统然后远程系统会将它们解包并调用远程方法

假设您创建了一个 RMI 对象并将它注册到 RMI 注册表或者 Java 命名和目录接口(Java Naming and Directory Interface (JNDI))名称空间当远程客户机调用其中的一个方法时该方法会在什么线程中执行呢?

实现 RMI 对象的常用方法是继承 UnicastRemoteObject在构造 UnicastRemoteObject 时会初始化用于分派远程方法调用的基础结构这包括用于接收远程调用请求的套接字侦听器和一个或多个执行远程请求的线程

所以当接收到执行 RMI 方法的请求时这些方法将在 RMI 管理的线程中执行

小结

线程通过几种机制进入 Java 程序除了用 Thread 构造器中显式创建线程之外还可以用许多其它机制创建线程

AWT 和 Swing

RMI

javautilTimerTask 工具

servlet 和 JSP 技术

               

上一篇:戏说java设计模式中的命令模式

下一篇:Java单例对象同步问题探讨