Java多线程编程

一、Java线程API

Java标准库类java.lang.Thread就是Java平台对线程的实现。Thread类或其子类的一个实例就是一个线程。
每个线程都有其要执行的任务。线程的任务处理逻辑可以在Thread类的run实例方法中直接实现或通过该方法进行调用,因此run方法相当于线程的任务处理逻辑的入口方法,它由Java虚拟机在运行相关线程时直接调用,而不是由应用代码进行调用。
运行一个线程实际上就是让Java虚拟机执行该线程的run方法,从而使相应线程的任务处理逻辑代码得以执行。为此,首先要使用Thread类的start方法来启动相应的线程。启动一个线程的实质是请求Java虚拟机运行相应的线程,而这个代码何时能够运行是由线程调度器(Scheduler)决定的。因此,start方法调用结束并不意味着相应线程已经开始运行,这个线程可能稍后才被运行,也可能永远不会被执行。
Thread类的两个常用构造器是Thread()和Thread(Runnable target),相应地,Java语言中创建线程有两种方式:定义Thread类的子类,在该子类中覆盖run方法并在该方法中实现线程任务处理逻辑;另一种是创建一个java.lang.Runnable的实例,并在该实例的run方法中实现任务处理逻辑,然后以该Runnable接口实例作为构造器的参数直接创建一个Thread类的实例。
运行结束的线程所占用的资源(如内存空间)会如同其他Java对象一样被Java虚拟机垃圾回收!
在Java平台中,一个线程就是一个对象,对象的创建离不开内存空间的分配。创建一个线程与创建其他类型的Java对象不同的是,Java虚拟机会为每个线程分配调用栈所需的内存空间。另外,Java平台中的每个线程可能还有一个内核线程与之对应。因此相对来说,创建线程对象比创建其他类型的对象成本要高一些!

优先使用实现Runnable接口的方式来创建线程,但这种创建方式意味着多个线程实例可以共享同一个Runnable实例,因为用组合的方式创建线程时,Thread.run方法中的源码是只要target不为null时就直接执行target所引用的Runnable实例所实现的任务处理逻辑,所以在某些情况下可能导致程序的运行结果出乎意料!使用extends继承Thread方式创建的线程实例在创建时,JVM会为其分配调用栈空间、内核线程等资源。(是空间独立的!)这就涉及到线程安全了!

Java中任何一段代码总是执行在某个线程之中,所以在多线程编程中,务必要弄清楚一段代码到底是由那个或那种线程去负责具体执行的,所以对于线程实例,有必要调用其setName方法命名一个有意义的线程名!
Java平台中并没有API用于获取一个线程的父线程,或者获取一个线程的所有子线程。并且,父线程和子线程之间的生命周期也没有必然的联系。父线程运行结束后,子线程可以继续运行,子线程运行结束后也不妨碍其父线程继续运行!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值