java多线程概念和原理

多线程是程序员面试时常常会面对的问题,对多线程概念的掌握和理解水平,也会被一些老鸟用来衡量一个人的编程实力的重要参考指标。不论是实际工作需要还是为了应付面试,掌握多线程都是程序员职业生涯中一个必须经过的环节。其实当你把“多线程”和你的“职业生涯”联系在一起考虑的时候,就会觉得“多线程”是多么的渺小,对,没有跨越不过的山。不过就算它很渺小,但也有可能改变你的人生轨迹。不用担心,如果你对多线程还不太熟悉,那么我们就一起来看看什么是多线程吧。

在一个程序中,这些独立运行的程序片断叫作“线程”(Thread),利用它编程的概念就叫作“多线程处理”。多线程处理一个常见的例子就是用户界面。利用线程,用户可按下一个按钮,然后程序会立即作出响应,而不是让用户等待程序完成了当前任务以后才开始响应。

什么是多线程?
  在计算机编程中,一个基本的概念就是同时对多个任务加以控制。许多程序设计问题都要求程序能够停下手头的工作,改为处理其他一些问题,再返回主进程。可以通过多种途径达到这个目的。最开始的时候,那些掌握机器低级语言的程序员编写一些“中断服务例程”,主进程的暂停是通过硬件级的中断实现的。尽管这是一种有用的方法,但编出的程序很难移植,由此造成了另一类的代价高昂问题。中断对那些实时性很强的任务来说是很有必要的。但对于其他许多问题,只要求将问题划分进入独立运行的程序片断中,使整个程序能更迅速地响应用户的请求。   最开始,线程只是用于分配单个处理器的处理时间的一种工具。但假如操作系统本身支持多个处理器,那么每个线程都可分配给一个不同的处理器,真正进入“并行运算”状态。从程序设计语言的角度看,多线程操作最有价值的特性之一就是程序员不必关心到底使用了多少个处理器。程序在逻辑意义上被分割为数个线程;假如机器本身安装了多个处理器,那么程序会运行得更快,毋需作出任何特殊的调校。根据前面的论述,大家可能感觉线程处理非常简单。但必须注意一个问题:共享资源!如果有多个线程同时运行,而且它们试图访问相同的资源,就会遇到一个问题。举个例子来说,两个线程不能将信息同时发送给一台打印机。为解决这个问题,对那些可共享的资源来说(比如打印机),它们在使用期间必须进入锁定状态。所以一个线程可将资源锁定,在完成了它的任务后,再解开(释放)这个锁,使其他线程可以接着使用同样的资源。   多线程是为了同步完成多项任务,不是为了提高运行效率,而是为了提高资源使用效率来提高系统的效率。线程是在同一时间需要完成多项任务的时候实现的。   最简单的比喻多线程就像火车的每一节车厢,而进程则是火车。车厢离开火车是无法跑动的,同理火车也不可能只有一节车厢。多线程的出现就是为了提高效率。同时它的出现也带来了一些问题。

使用线程的好处

  ·使用线程可以把占据时间长的程序中的任务放到后台去处理

  ·用户界面可以更加吸引人,这样比如用户点击了一个按钮去触发某些事件的处理,可以弹出一个进度条来显示处理的进度

   ·程序的运行速度可能加快

   ·在一些等待的任务实现上如用户输入、文件读写和网络收发数据等,线程就比较有用了。在这种情况下可以释放一些珍贵的资源如内存占用等等。

   还有其他很多使用多线程的好处,这里就不一一说明了。

 使用线程的一些缺点

  ·如果有大量的线程,会影响性能,因为操作系统需要在它们之间切换。

   ·更多的线程需要更多的内存空间。

   ·线程可能会给程序带来更多“bug”,因此要小心使用。

   ·线程的中止需要考虑其对程序运行的影响。

   ·通常块模型数据是在多个线程间共享的,需要防止线程死锁情况的发生。

Thread类和Runnable接口

多线程是一个程序中可以有多段代码同时运行,那么这些代码写在哪里,如何创建线程对象呢? 首先,我们来看Java语言实现多线程编程的类和接口。在java.lang包中定义了Runnable接口和Thread类。 Runnable接口中只定义了一个方法,

它的格式为:

 • public abstract void run() 

 这个方法要由实现了Runnable接口的类实现。Runnable对象称为可运行对象,一个线程的运行就是执行该对象的run()方法。 Thread类实现了Runnable接口,因此Thread对象也是可运行对象。

同时Thread类也是线程类,该类的构造方法如下:

• public Thread() 

 • public Thread(Runnable target)

 • public Thread(String name)

 • public Thread(Runnable target, String name)

 • public Thread(ThreadGroup group, Runnable target)

 • public Thread(ThreadGroup group, String name)

• public Thread(ThreadGroup group,

 Runnable target, String name) target为线程运行的目标对象,即线程调用start()方法启动后运行那个对象的run()方法,该对象的类型为Runnable,若没有指定目标对象,则以当前类对象为目标对象;name为线程名,group指定线程属于哪个线程组(有关线程组的概念请参考9.6节)。

Thread类的常用方法有:

 • public static Thread currentThread() 返回当前正在执行的线程对象的引用。

 • public void setName(String name) 设置线程名。

• public String getName() 返回线程名。

 • public static void sleep(long millis) throws InterruptedException

• public static void sleep(long millis, int nanos) throws InterruptedException 使当前正在执行的线程暂时停止执行指定的毫秒时间。指定时间过后,线程继续执行。该方法抛出InterruptedException异常,必须捕获。

 • public void run() 线程的线程体。

• public void start() 由JVM调用线程的run()方法,启动线程开始执行。

• public void setDaemon(boolean on) 设置线程为Daemon线程。

• public boolean isDaemon() 返回线程是否为Daemon线程。

• public static void yield() 使当前执行的线程暂停执行,允许其他线程执行。

 • public ThreadGroup getThreadGroup() 返回该线程所属的线程组对象。

• public void interrupt() 中断当前线程。

 • public boolean isAlive() 返回指定线程是否处于活动状态

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值