Java多线程程序初步设计方法是什么

技术Java多线程程序初步设计方法是什么本篇内容主要讲解“Java多线程程序初步设计方法是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java多线程程序初步设计方法是什

本文主要讲解“Java多线程程序的初步设计方法是什么”,有兴趣的朋友不妨看看。本文介绍的方法简单、快速、实用。让边肖学习“Java多线程程序的初步设计方法是什么”!

在Java语言产生之前,传统编程语言的程序只能同时对单个任务进行操作,效率非常低。例如,程序在接收数据输入时经常阻塞,只有在程序获得数据后才能继续运行。随着互联网的快速发展,这种情况越来越难以忍受:如果网络收到数据阻塞,后台程序将处于等待状态,没有继续任何操作,并且经常会遇到这种阻塞,此时CPU资源将被白白闲置。如果能在后台程序中同时处理多个任务该多好啊!源于互联网技术的Java语言解决了这个问题,多线程程序是Java语言的一个非常重要的特性。在一个Java程序中,我们可以同时并行运行多个相对独立的线程。例如,如果我们在后台创建一个线程用于数据输入输出,另一个线程用于其他数据处理,如果输入输出线程在接收数据时被阻塞,而处理数据的线程仍在运行。多线程编程大大提高了程序执行的效率和处理能力。

线程的创建

我们知道Java是一种面向对象的编程语言。用Java编程意味着设计和使用类。Java为我们提供了线程类Thread来创建线程。创建线程的操作与创建普通类的对象相同,线程是线程类或其子类的实例对象。以下是创建和启动线程的语句:

thread 1=new thread();File://声明一个对象实例,即创建一个线程;thread 1 . run();File://用Thread类中的run()方法启动线程;从这个例子中,我们可以通过thread()构造函数创建一个Thread并启动该线程。其实启动thread,也就是启动线程的run()方法,Thread类中的run()方法没有操作语句,所以这个线程没有操作。为了让线程实现预定的功能,需要定义自己的run()方法。在Java中,通常有两种方法来定义run()方法:

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

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

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

下面的示例显示了如何通过上述两种方法创建线程并启动它们:

//由Thread类的子类创建的线程;

类线程1扩展线程

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

publicvoidrun()

{

system . out . println(' thread 1 is running…');

}

}

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

classthread2implementsRunnable

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

publicvoidrun()

{

system . out . println(' thread 2 is running…');

}

}

文件://程序的主类'

class multi _ threadfile :///声明主类;

{

plubistaticvoitmail(String Args[])file ://声明主方法;

{

thread 1 readone=new thread 1();File://用Thread类的子类创建线程;

Threadth

readtwo=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,可以是一个或多个)不可能取得钥匙,只有当生产者添放产品结束,交还钥匙并且通知销售者,不同的销售者根据取得钥匙的先后与否决定是否可以进入仓库中提走产品。

到此,相信大家对“Java多线程程序初步设计方法是什么”有了更深的了解,不妨来实际操作一番吧!这里是网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/107926.html

(0)

相关推荐

  • kafka新版常用命令有哪些

    技术kafka新版常用命令有哪些这篇文章将为大家详细讲解有关kafka新版常用命令有哪些,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。1/列出topic的命令为:kafka-topic

    攻略 2021年11月21日
  • git_stats web代码图形统计工具怎么使用

    技术git_stats web代码图形统计工具怎么使用这篇文章主要讲解了“git_stats web代码图形统计工具怎么使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“

    攻略 2021年12月10日
  • 如何分析SQL Server中的SQL语句优化与效率问题

    技术如何分析SQL Server中的SQL语句优化与效率问题今天就跟大家聊聊有关如何分析SQL Server中的SQL语句优化与效率问题,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这

    攻略 2021年12月1日
  • java线程思维导图是怎么样的

    技术java线程思维导图是怎么样的这篇文章将为大家详细讲解有关java线程思维导图是怎么样的,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。晚上在家利用二个小时时间整理了J

    攻略 2021年10月23日
  • 亲核取代反应,单分子亲核取代反应的特点

    技术亲核取代反应,单分子亲核取代反应的特点单分子亲核取代反应(unimolecular nucleophilic substitution)是只有一种分子参与了决定反应速率关键步骤的亲核取代反应亲核取代反应,简写为SN1

    生活 2021年10月21日
  • VS连接sqlsever数据库

    技术VS连接sqlsever数据库 VS连接sqlsever数据库工具:
    1.Visual Studio (我使用的是vs2013)
    2.SQL Server (我使用的是sql server2008)

    礼包 2021年11月22日