一般可以在同一时间内执行多个程序的操作系统都有进程的概念。一个进程就是一个执行中的程序,而每一个进程都有自己独立的一块内存空间、一组系统资源。在进程的概念中,每一个进程的内部数据和状态都是完全独立的。
在Windows操作系统下可以通过Ctrl+Alt+Del组合键查看进程,在UNIX和Linux操作系统下是通过ps命令查看进程的。
在Windows操作系统中一个进程就是一个exe或者dll程序,它们相互独立,互相也可以通信。
线程
线程与进程相似,是一段完成某个特定功能的代码,是程序中单个顺序控制的流程,但与进程不同的是,同类的多个线程是共享一块内存空间和一组系统资源。所以系统在各个线程之间切换时,开销要比进程小的多,正因如此,线程被称为轻量级进程。一个进程中可以包含多个线程。
主线程
Java程序至少会有一个线程,这就是主线程,程序启动后是由JVM创建主线程,程序结束时由JVM停止主线程。主线程它负责管理子线程,即子线程的启动、挂起、停止等等操作。
子线程
Java中创建一个子线程涉及到:java.lang.Thread类和java.lang.Runnable接口。Thread是线程类,创建一个Thread对象就会产生一个新的线程。而线程执行的程序代码是在实现Runnable接口对象的run()方法中编写的,实现Runnable接口对象是线程执行对象。
线程执行对象实现Runnable接口的run()方法,run()方法是线程执行的入口,该线程要执行程序代码都在此编写的,run()方法称为线程体。
提示 主线程中执行入口是main(String[] args)方法,这里可以控制程序的流程,管理其他的子线
程等。子线程执行入口是线程执行对象(实现Runnable接口对象)的run()方法,在这个方法可以
编写子线程相关处理代码。
Runnable接口
创建线程Thread对象时,可以将线程执行对象传递给它,这需要是使用Thread类如下两个构造方法:
- Thread(Runnable target, String name):target是线程执行对象,实现Runnable接口。name为线程指定一个名字。
- Thread(Runnable target):target是线程执行对象,实现Runnable接口。线程名字是由JVM分配的。
sleep是静态方法它有两个版本:
- static void sleep(long millis):在指定的毫秒数内让当前正在执行的线程休眠。
- static void sleep(long millis, int nanos) 在指定的毫秒数加指定的纳秒数内让当前正在执行的线程休眠。
Thread线程类
事实上Thread类也实现了Runnable接口,所以Thread类也可以作为线程执行对象,这需要继承Thread类,覆盖run()方法。
Thread类构造方法:
- Thread(String name):name为线程指定一个名字。代码第④行调用都就是此构造方法。
- Thread():线程名字是JVM分配的。代码第②行调用都就是此构造方法。
由于Java只支持单重继承,继承Thread类的方式不能再继承其他父类。当开发一些图形界
面的应用时,需要一个类既是一个窗口(继承JFrame)又是一个线程体,那么只能采用实现
Runnable接口方式。
线程的状态
在线程的生命周期中,线程会有几种状态,线程有5种状态。。
新建状态
新建状态(New)是通过new等方式创建线程对象,它仅仅是一个空的线程对象。
就绪状态
当主线程调用新建线程的start()方法后,它就进入就绪状态(Runnable)。此时的线程尚未真正开始执行run()方法,它必须等待CPU的调度。
运行状态
CPU的调度就绪状态的线程,线程进入运行状态(Running),处于运行状态的线程独占CPU,执行run()方法。
阻塞状态
因为某种原因运行状态的线程会进入不可运行状态,即阻塞状态(Blocked),处于阻塞状态的线程JVM系统不能执行该线程,即使CPU空闲,也不能执行该线程。如下几个原因会导致线程进入阻塞状态:
- 当前线程调用sleep()方法,进入休眠状态。
- 被其他线程调用了join()方法等待其他线程结束。
- 发出I/O请求,等待I/O操作完成期间。
- 当前线程调用wait()方法。
处于阻塞状态可以重新回到就绪状态,如:休眠结束、其他线程加入、I/O操作完成和调用notify或notifyAll唤醒wait线程。
死亡状态
线程退出run()方法后,就会进入死亡状态(Dead),线程进入死亡状态有可以是正常实现完成run()方法进入,也可能是由于发生异常而进入的。
线程优先级
线程的调度程序根据线程决定每次线程应当何时运行,Java提供了10种优先级,分别用1~10整数表示,最高优先级是10用常量MAX_PRIORITY表示;最低优先级是1用常量MIN_PRIORITY;默认优先级是5用常量NORM_PRIORITY表示。
Thread类提供了setPriority(int newPriority)方法可以设置线程优先级,通过getPriority()方法获得线程优先级。
版权声明:
一、本站致力于为软件爱好者提供国内外软件开发技术和软件共享,着力为用户提供优资资源。
二、本站提供的所有下载文件均为网络共享资源,请于下载后的24小时内删除。如需体验更多乐趣,还请支持正版。
三、我站提供用户下载的所有内容均转自互联网。如有内容侵犯您的版权或其他利益的,请编辑邮件并加以说明发送到站长邮箱。站长会进行审查之后,情况属实的会在三个工作日内为您删除。
如若转载,请注明出处:https://www.quange.cc/note/java/java-books-note/1390.html
共有 0 条评论