线程是什么?
线程是比进程更小的执行单位,是程序运行的基本执行单元。合理地使用线程是减少开发和维护成本的必要条件,甚至能够改善复杂应用程序的性能。所谓多线程是指一个进程在执行过程中可以产生多个同时存在、同时运行的线程。
多线程机制可以合理利用资源,提高程序运行效率。一个进程至少包含一个线程,程序运行时即自动产生一个线程,比如在 Java中主函数Main就是在线程上运行的。
java中多线程的实现有两种方法:
Java中使用java.lang.Thread类控制线程,继承Thread的类就可以被称为多线程操作类。需要注意,在继承Thread类的子类中必须重写Thread类中的run( )方法,该方法为线程的主体。
由于在Java中只允许单继承,所以某类若继承了Thread类,则必定会受到单继承局限性的影响,不能再继承其他类。为摆脱这种影响,可以通过实现Runnable接口的形式实现多线程。
与继承Thread类相同,通过实现Runnable接口的方式实现多线程需要重写run( )方法,启动多线程需要使用start( )方法实现。继承了Thread的类可以直接完成启动,但实现Runnable接口的线程类需要通过Thread类中提供的public Thread(Runnable target)构造方法,实现线程的启动。
注意:正确使用线程不能直接调用run()方法而是要调用从Thread类当中继承来的start()方法。
-
继承Thread类,示例如下:
public class ThreadDemo2 extends Thread{
private String name;
public ThreadDemo2(String name){
this.name = name; }
//重写Thread类中的方法
public void run() {
for(int i = 1;i <=5; i++){
System.out.println(name+"运行,i="+i);
}
}
public static void main(String[] args) {
new ThreadDemo2("线程A").start();
new ThreadDemo2("线程B").start();
}
}
- 实现Runnable接口 ,示例如下:
//实现Runnable接口
public class ThreadDemo3 implements Runnable{
private String name;
public ThreadDemo3(String name) {
this.name = name;
}
public void run() {
for(int i=1;i<=15;i++){
System.out.println(name+"运行,i="+i);
}
}
public static void main(String[] args) {
ThreadDemo3 demo1 = new ThreadDemo3("线程A");
ThreadDemo3 demo2 = new ThreadDemo3("线程B");
Thread t1 = new Thread(demo1);
//实例化Thread类
Thread t2 = new Thread(demo2);
t1.start();//启动线程
t2.start();
}
}
Thread类与Runnable接口的区别
在多线程的实现方式中,Thread类与Runnable接口在使用上是有区别的:
- 继承了Thread的类不适合多个线程共享资源;
- 而实现了Runnable接口可以方便地实现资源共享
实现Runnable接口与继承Thread类在实现多线程中相比具备以下优势:
- 适合多个具有相同程序代码的线程处理同一资源。
- 可以避免Java的单继承特征带来的局限性。
- 代码能够被多个线程共享且与数据独立存在,从而增加了程序的健壮性。
线程常用操作方法:
方法 | 描述 |
public static Thread currentThread( ) | 返回当前的线程 |
public final String getName( ) | 返回线程名称 |
public final void setPriority(int priority) | 设置线程优先级 |
public void start( ) | 开始执行线程 |
public static void sleep(long m) | 使目前的线程休眠 |
public final void yield( ) | 暂停目前的线程,运行其他线程 |
public void run( ) | 执行线程 |
线程的生命周期:
1. 创建状态:程序中使用构造方法创建线程对象后,新线程对象即处于创建状态。线程此时已经具有相应的内存空间和其他资源但不可运行。
2. 就绪状态:线程对象创建后调用start( )方法启动线程,即进入就绪状态。就绪状态下的线程进入线程队列,等待CPU调用。
3. 运行状态:线程获得CPU服务后即处于运行状态,此时将自动调用线程对象的run( )方法。run( )方法定义了该线程的具体操作和实现功能。需要注意的是运行状态下的线程调用yield( )方法后,将从运行状态返回至就绪状态。
4. 阻塞状态:运行状态的线程调用sleep( )、wait( )等方法后将进入阻塞状态。线程阻塞条件解除后,线程再次转入就绪状态。
5. 终止状态:当线程执行run( )方法完毕后处于终止状态(又称死亡状态),处于终止状态下的线程不具有继续运行的能力。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/115851.html