iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >Java多线程程序设计入门(转)
  • 664
分享到

Java多线程程序设计入门(转)

2023-06-03 05:06:59 664人浏览 泡泡鱼
摘要

Java多线程程序设计入门(转)[@more@]在Java语言产生前,传统的程序设计语言的程序同一时刻只能单任务操作,效率非常低,例如程序往往在接收数据输入时发生阻塞,只有等到程序获得数据后才能继续运行。随着Internet的迅猛发展,这种

Java多线程程序设计入门(转)[@more@]在Java语言产生前,传统的程序设计语言的程序同一时刻只能单任务操作,效率非常低,例如程序往往在接收数据输入时发生阻塞,只有等到程序获得数据后才能继续运行。随着Internet的迅猛发展,这种状况越来越不能让人们忍受:如果网络接收数据阻塞,后台程序就处于等待状态而不继续任何操作,而这种阻塞是经常会碰到的,此时CPU资源被白白的闲置起来。如果在后台程序中能够同时处理多个任务,该多好啊!应Internet技术而生的Java语言解决了这个问题,多线程程序是Java语言的一个很重要的特点。在一个Java程序中,我们可以同时并行运行多个相对独立的线程,例如,我们如果创建一个线程来进行数据输入输出,而创建另一个线程在后台进行其它的数据处理,如果输入输出线程在接收数据时阻塞,而处理数据的线程仍然在运行。多线程程序设计大大提高了程序执行效率和处理能力。


  线程的创建


  我们知道Java是面向对象的程序语言,用Java进行程序设计就是设计和使用类,Java为我们提供了线程类Thread来创建线程,创建线程与创建普通的类的对象的操作是一样的,而线程就是Thread类或其子类的实例对象。下面是一个创建启动一个线程的语句:


  Thread thread1=new Thread(); file://声明一个对象实例,即创建一个线程;


  Thread1.run(); file://用Thread类中的run()方法启动线程;


  从这个例子,我们可以通过Thread()构造方法创建一个线程,并启动该线程。事实上,启动线程,也就是启动线程的run()方法,而 Thread类中的run()方法没有任何操作语句,所以这个线程没有任何操作。要使线程实现预定功能,必须定义自己的run()方法。Java中通常有两种方式定义run()方法:


  通过定义一个Thread类的子类,在该子类中重写run()方法。Thread子类的实例对象就是一个线程,显然,该线程有我们自己设计的线程体run()方法,启动线程就启动了子类中重写的run()方法。


  通过Runnable接口,在该接口中定义run()方法的接口。所谓接口跟类非常类似,主要用来实现特殊功能,如复杂关系的多重继承功能。在此,我们定义一个实现Runnable() 接口的类,在该类中定义自己的run()方法,然后以该类的实例对象为参数调用Thread类的构造方法来创建一个线程。


  线程被实际创建后处于待命状态,激活(启动)线程就是启动线程的run()方法,这是通过调用线程的start()方法来实现的。


  下面一个例子实践了如何通过上述两种方法创建线程并启动它们:


  // 通过Thread类的子类创建的线程;


   class thread1 extends Thread


    { file://自定义线程的run()方法;


     public void run()


      {


       System.out.println("Thread1 is running…");


      }


     }


   file://通过Runnable接口创建的另外一个线程;


  class thread2 implements Runnable


   { file://自定义线程的run()方法;


    public void run()


    {


     System.out.println("Thread2 is running…");


    }


   }


   file://程序的主类´


   class Multi_Thread file://声明主类;


    {


     plubic static void mail(String args[]) file://声明主方法;


      {


       thread1 threadone=new thread1(); file://用Thread类的子类创建线程;


       Thread threadtwo=new Thread(new thread2()); file://用Runnable接口类的对象创建线程;


       threadone.start(); threadtwo.start(); file://strat()方法启动线程;


      }


     }


  运行该程序就可以看出,线程threadone和threadtwo交替占用CPU,处于并行运行状态。可以看出,启动线程的run()方法是通过调用线程的start()方法来实现的(见上例中主类),调用start()方法启动线程的run()方法不同于一般的调用方法,调用一般方法时,必须等到一般方法执行完毕才能够返回start()方法,而启动线程的run()方法后,start()告诉系统该线程准备就绪可以启动run()方法后,就返回start()方法执行调用start()方法语句下面的语句,这时run()方法可能还在运行,这样,线程的启动和运行并行进行,实现了多任务操作。


  线程的优先级


  对于多线程程序,每个线程的重要程度是不尽相同,如多个线程在等待获得CPU时间时,往往我们需要优先级高的线程优先抢占到CPU时间得以执行;又如多个线程交替执行时,优先级决定了级别高的线程得到CPU的次数多一些且时间多长一些;这样,高优先级的线程处理的任务效率就高一些。


  Java中线程的优先级从低到高以整数1~10表示,共分为10级,设置优先级是通过调用线程对象的setPriority()方法,如上例中,设置优先级的语句为:


  thread1 threadone=new thread1(); file://用Thread类的子类创建线程;
  Thread threadtwo=new Thread(new thread2()); file://用Runnable接口类的对象创建线程;


  threadone.setPriority(6); file://设置threadone的优先级6;


  threadtwo.setPriority(3); file://设置threadtwo的优先级3;


  threadone.start(); threadtwo.start(); file://strat()方法启动线程;


  这样,线程threadone将会优先于线程threadtwo执行,并将占有更多的CPU时间。该例中,优先级设置放在线程启动前,也可以在启动后进行设置,以满足不同的优先级需求。


  线程的(同步)控制


  一个Java程序的多线程之间可以共享数据。当线程以异步方式访问共享数据时,有时候是不安全的或者不和逻辑的。比如,同一时刻一个线程在读取数据,另外一个线程在处理数据,当处理数据的线程没有等到读取数据的线程读取完毕就去处理数据,必然得到错误的处理结果。这和我们前面提到的读取数据和处理数据并行多任务并不矛盾,这儿指的是处理数据的线程不能处理当前还没有读取结束的数据,但是可以处理其它的数据。


  如果我们采用多线程同步控制机制,等到第一个线程读取完数据,第二个线程才能处理该数据,就会避免错误。可见,线程同步是多线程编程的一个相当重要的技术。


  在讲线程的同步控制前我们需要交代如下概念:


  1 用Java关键字synchonized同步对共享数据操作的方法


  在一个对象中,用synchonized声明的方法为同步方法。Java中有一个同步模型-监视器,负责管理线程对对象中的同步方法的访问,它的原理是:赋予该对象唯一一把´钥匙´,当多个线程进入对象,只有取得该对象钥匙的线程才可以访问同步方法,其它线程在该对象中等待,直到该线程用 wait()方法放弃这把钥匙,其它等待的线程抢占该钥匙,抢占到钥匙的线程后才可得以执行,而没有取得钥匙的线程仍被阻塞在该对象中等待。
  file://声明同步的一种方式:将方法声明同步


  class store


   {


    public synchonized void store_in()


    {
     ….


    }
    public synchonized void store_out(){


       ….}
    }


  2 利用wait()、notify()及notifyAll()方法发送消息实现线程间的相互联系


  Java程序中多个线程通过消息来实现互动联系的,这几种方法实现了线程间的消息发送。例如定义一个对象的synchonized 方法,同一时刻只能够有一个线程访问该对象中的同步方法,其它线程被阻塞。通常可以用notify()或notifyAll()方法唤醒其它一个或所有线程。而使用wait()方法来使该线程处于阻塞状态,等待其它的线程用notify()唤醒。


  一个实际的例子就是生产和销售,生产单元将产品生产出来放在仓库中,销售单元则从仓库中提走产品,在这个过程中,销售单元必须在仓库中有产品时才能提货;如果仓库中没有产品,则销售单元必须等待。


  程序中,假如我们定义一个仓库类store,该类的实例对象就相当于仓库,在store类中定义两个成员方法:store_in(),用来模拟产品制造者往仓库中添加产品;strore_out()方法则用来模拟销售者从仓库中取走产品。然后定义两个线程类:customer类,其中的run ()方法通过调用仓库类中的store_out()从仓库中取走产品,模拟销售者;另外一个线程类producer中的run()方法通过调用仓库类中的 store_in()方法向仓库添加产品,模拟产品制造者。在主类中创建并启动线程,实现向仓库中添加产品或取走产品。


  如果仓库类中的store_in() 和store_out()方法不声明同步,这就是个一般的多线程,我们知道,一个程序中的多线程是交替执行的,运行也是无序的,这样,就可能存在这样的问题:


  仓库中没有产品了,销售者还在不断光顾,而且还不停的在´取´产品,这在现实中是不可思义的,在程序中就表现为负值;如果将仓库类中的 stroe_in()和store_out()方法声明同步,如上例所示:就控制了同一时刻只能有一个线程访问仓库对象中的同步方法;即一个生产类线程访问被声明为同步的store_in()方法时,其它线程将不能够访问对象中的store_out()同步方法,当然也不能访问store_in()方法。必须等到该线程调用wait()方法放弃钥匙,其它线程才有机会访问同步方法。


  这个原理实际中也很好理解,当生产者(producer)取得仓库唯一的钥匙,就向仓库中添放产品,此时其它的销售者(customer,可以是一个或多个)不可能取得钥匙,只有当生产者添放产品结束,交还钥匙并且通知销售者,不同的销售者根据取得钥匙的先后与否决定是否可以进入仓库中提走产品。

--结束END--

本文标题: Java多线程程序设计入门(转)

本文链接: https://www.lsjlt.com/news/232908.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Java多线程程序设计入门(转)
    Java多线程程序设计入门(转)[@more@]在Java语言产生前,传统的程序设计语言的程序同一时刻只能单任务操作,效率非常低,例如程序往往在接收数据输入时发生阻塞,只有等到程序获得数据后才能继续运行。随着Internet的迅猛发展,这种...
    99+
    2023-06-03
  • Java—实现多线程程序 | 入门
      目录 一、前言 二、基本概念 进程  线程 三、Java多线程实现 java.lang.Thread类 获取线程名字及对象 获取main进程名 Thread currentThread() 四、线程优先级  设置优先级  一、前言 前...
    99+
    2023-09-07
    java 开发语言 Java多线程程序 多线程 Thread类
  • 怎么解析Java多线程程序设计
    小编今天带大家了解怎么解析Java多线程程序设计,文中知识点介绍的非常详细。觉得有帮助的朋友可以跟着小编一起浏览文章的内容,希望能够帮助更多想解决这个问题的朋友找到问题的答案,下面跟着小编一起深入学习“怎么解析Java多线程程序设计”的知识...
    99+
    2023-06-03
  • Java多线程之Disruptor入门
    目录一、Disruptor简介二、浅聊Disruptor的核心三、Disruptor使用3.1pom.xml3.2事件Event3.3EventFactory3.4EventHand...
    99+
    2024-04-02
  • Java语言深入 多线程程序模型研究(转)
    Java语言深入 多线程程序模型研究(转)[@more@]多线程是较复杂程序设计过程中不可缺少的一部分。为了提高应用程序运行的性能,采用多线程的设计是一种比较可行的方案。本文通过介绍使用Java编写的扫描计算机端口的实例,来说明多线程设计中...
    99+
    2023-06-03
  • 如何浅析Java多线程程序的设计机制
    本篇文章为大家展示了如何浅析Java多线程程序的设计机制,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。浅析Java多线程程序设计机制多线程是Java语言的一大特性,多线程就是同时存在N个执行体,按几...
    99+
    2023-06-03
  • Python多线程入门学习
    Python 中使用线程有两种方式:函数或者用类来包装线程对象。 函数式: 调用 thread 模块中的start_new_thread()函数来产生新线程。 语法如下: thr...
    99+
    2024-04-02
  • Java多线程之Future设计模式
    目录Future -> 代表的是未来的一个凭据AsynFuture -> Future具体实现类FutureService -> 桥接Future和FutureTa...
    99+
    2024-04-02
  • Python多线程编程入门详解
    目录一、任务、进程和线程任务进程线程进程和线程的关系二、Python既支持多进程,又支持多线程Python实现多进程Process进程类的说明Python实现多线程线程类Thread...
    99+
    2024-04-02
  • Java多线程 Guarded Suspension设计模式
    目录1.Guarded Suspension模式的结构2. Guarded Suspension模式的简单实现前言: Guarded Suspension意为保护暂停,其核心思想是仅...
    99+
    2024-04-02
  • 一篇文章带你Java多线程入门
    目录多线程的四种创建方式1.继承Thread类2.实现Runnable接口3.实现Callable接口4.使用线程池线程的优先级测试Thread中常用的方法线程的生命周期多线程的同步...
    99+
    2024-04-02
  • python爬虫入门八:多进程/多线程
    引用虫师的解释: 计算机程序只不过是磁盘中可执行的,二进制(或其它类型)的数据。它们只有在被读取到内存中,被操作系统调用的时候才开始它们的生命期。 进程(有时被称为重量级进程)是程序的一次执行。每个进程都有自己的地址空间,内存,数据栈...
    99+
    2023-01-30
    爬虫 多线程 入门
  • 一篇文章带你入门java多线程
    目录一、描述二、一个线程的生命周期三、线程的优先级四、创建线程五、示例1、Runnable接口2、继承Thread3、Callable 和 Future 创建线程4、测试总结一、描述...
    99+
    2024-04-02
  • PHP入门指南:多线程编程
    PHP是一种流行的服务器端编程语言,用于创建Web应用程序和动态网站。虽然PHP本身不支持多线程编程,但它提供了一些工具和扩展,可用于实现非阻塞I/O操作和进程间通信。本文将介绍PHP多线程编程的基本知识和工具。多线程编程基础多线程编程是一...
    99+
    2023-05-20
    PHP(编程语言) 多线程编程(并发编程方式) 入门指南(针对初学者的指导文本)
  • 创建java多线程程序
    目录创建多线程程序的第一种方式:创建Thread类的子类实现步骤:创建多线程程序的第二种方式:实现RunnabLe接口java.Lang.Thread类的构造方法实现步骤:实现Run...
    99+
    2024-04-02
  • Java多线程 Producer and Consumer设计模式
    目录 producer是生产者的意思:指生产数据的线程, consumer是消费者的意思:指的是使用数据的线程 public class ProducerThr...
    99+
    2024-04-02
  • java多线程该设置多少个线程
    本篇内容主要讲解“java多线程该设置多少个线程”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“java多线程该设置多少个线程”吧!我们在使用线程池的时候,会有两个疑问点: 线程池的线程...
    99+
    2023-06-16
  • python线程入门
    目录 python线程入门 线程与进程 线程 总结 参考 pytho...
    99+
    2023-01-30
    线程 入门 python
  • Java程序设计基础实验一Java简单程序设计
    实验一 JAVA简单程序设计 一、实验目的 1.掌握Java应用程序的三个步骤:编写源文件、编译源文件和运行应用程序。 2.掌握同时编译多个Java文件。 3.掌握char型数据和int型数据之间的相互转换,同时了解Unicode字符表。 ...
    99+
    2023-10-11
    java
  • C# 异步多线程入门基础
    目录进程、线程1. 进程 2. 线程 分时、分片同步、异步异步、多线程异步多线程效率多线程无序性扩展异步多线程版本下一篇:C# 异步多线程入门到精通之Thread篇 进程、线程 1....
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作