您的位置 首页 java

java编程教程:多线程&并发编程

java 支持单线程以及 多线程 行动。单线程程序具有一个入口点(main()方法)和一个出口点。多线程程序具有初始入口点(main()方法),然后是许多入口和退出点,它们同时运行main().。“并发性“指同时做多项任务。 java已经内置支持并发编程通过在单个程序中并行运行多个 线程 。a螺纹,也称为a轻量级过程它是一个单一的编程操作流程,具有一定的起始和结束。在线程的生存期内,只有一个执行点。线程本身不是程序,因为它不能独立运行。相反,它运行在一个程序中。下图显示了一个在单个cpu下运行3个线程的程序:

多任务(或多处理)

现代操作系统(如windows和 unix )是多任务系统。多任务系统可以通过共享计算资源,如cpu(S)、主存和i/o通道来并行执行多个任务。在单cpu机器中,只有一个任务可以在一个时间内执行-通过时间切片cpu。在多cpu机器中,可以同时执行几个任务,要么分散在cpu上,要么分时间切片。

在今天的操作系统中,多任务处理是必要的,通过充分利用和优化计算资源的使用来更好地发挥性能。通常有两种多任务操作系统:

  1. 协作多任务系统*每项任务必须自愿对其他任务的输出控制。这就有一个缺点:运行或不合作任务可能会挂起整个系统。

  2. 预攻击多任务系统*任务是给定时间-cpu(S)的切片,并且一旦分配使用时,将被迫对其他任务进行控制。

多线程(在流程中)

在unix中,我们叉子一个新的过程。在windows中,我们启动一个程序。一个过程或程序有自己的地址空间和控制块。它叫做重量级因为它消耗了大量的系统资源。在流程或程序中,我们可以同时运行多个线程来提高性能。

线程不同于重量级进程,是轻量级的,并且运行在一个过程中-它们共享相同的地址空间、分配的资源以及该进程的环境。它是轻量级的,因为它运行在重量级进程的上下文中,并利用为该程序分配的资源和程序环境。线程必须在运行过程中创建自己的资源。例如,线程有自己的堆栈、寄存器和程序计数器。线程内运行的代码仅在该上下文中工作,因此,线程(连续操作流)也称为执行上下文。

通过优化系统资源的使用,程序内多线程提高了程序的性能。例如,当一个线程被阻塞(例如等待完成i/o操作)时,另一个线程可以使用cpu时间来执行计算,从而导致更好的性能和总体吞吐量。

多线程也是必要的,以提供更好的交互性与用户。例如,在一个字处理器中,当一个线程正在打印或保存文件时,另一个线程可以用来继续键入。在 gui 应用程序中,multithreading对于提供一个响应性用户界面。

对于本文,我假定您理解 swing 编程,因为swing应用程序依赖于multithreading(执行它们的特定函数、重新绘制和处理事件),最好是演示multithreading。

典型的java程序运行在单个进程中,并且对多个进程不感兴趣。但是,在过程中,它经常使用多线程来并发地运行多个任务。一个独立的java应用程序从一个线程开始(称为主螺纹()与main()方法相关联。这是主螺纹然后可以启动新的用户线程。

臭名昭著的“未响应用户界面”

声名狼藉无响应用户界面(Ui)问题最好用一个计数循环的swing程序来说明。

gui程序有两个按钮。推“start计数”按钮开始计数。推“停止计数”按钮是假想停止(停顿)计数。两个按钮处理程序通过boolean旗帜被称为stop.。停止按钮处理程序设置stop标记;当启动按钮处理程序检查stop在继续下一次计数之前,已经设置了标志。

您应该在eclipse/ NetBeans 下编写程序,以便我们能够跟踪线程。

但是,一旦启动了启动按钮,ui就会被推到冻住-显示器上没有更新计数器值(即显示不是刷新),并且用户界面没有响应单击停止按钮或任何其他用户交互。

跟踪线程(高级)

从程序跟踪(通过eclipse/NetBeans),我们观察到:

  1. 大main()方法是在“main”线程中启动的。

  2. jre的窗口子系统,通过SwingUtilities.invokeLater()开始3个线程:“awt-windows”( 守护线程 )、“awt-关闭”和“awt-EventQueue”。“awt-EventQueue-0”称为事件调度线程(EDT),这是唯一一个线程负责处理所有事件(例如单击按钮)并刷新显示以确保gui操作中 线程安全 并操作gui组件。 构造函数 UnresponsiveUI()计划在事件调度线程上运行(通过invokeLater())在所有现有事件都已处理之后。“main”线程在main()方法完成。创建了一个名为“DestroyJavaVM”的新线程。

  3. 单击启动按钮时,actionPerformed()运行在上。现在,在已经完全占用了计算密集型计数循环。换句话说,尽管计算正在进行,但在是忙无法处理任何事件(例如单击“停止按钮”或“窗口关闭”按钮)并刷新显示-直到计数完成和美国东部时间才可用。结果显示,显示会冻结直到计数循环完成。

建议在上运行gui构建代码,通过invokeLater().。这是因为许多gui组件都不能保证线程安全。将所有访问gui组件的访问都转移到单个线程中,确保线程安全。假设我们直接在main()方法(在“main”线程下)如下:

追踪表明:

  1. 大main()方法从“main”线程开始。

  2. 当我们进入构造函数时,将启动一个新线程“awt-windows”(守护线程)new UnresponsiveUI()“(因为”)extends JFrame“)

  3. 执行后“setVisible(true)“另外两个线程创建了-”awt-关闭“和”awt-EventQueue“(即,)。

  4. “main”线程在main()方法完成。创建了一个名为“DestroyJavaVM”的新线程。

  5. 此时,有4个线程运行-“awt-windows”、“awt-关闭”和“awt-EventQueue(美国东部时间)”和“DestroyJavaVM”。

  6. 单击启动按钮调用actionPerformed()在美国东部地区。

在前面的示例中,在是通过invokeLater()在后一种情况下,在开始后setVisible()…

文章来源:智云一二三科技

文章标题:java编程教程:多线程&并发编程

文章地址:https://www.zhihuclub.com/194697.shtml

关于作者: 智云科技

热门文章

网站地图