实现线程的两种方式

1:继承java.lang.Thread类

Thread是java.lang包中的一个子类,从这个类中实例化的对象代表线程,通过继承创建并执行一个线程
通过继承Thread类创建并执行一个线程步骤如下:

  1. 创建一个能继承Thread类的子类
  2. 覆写Thread中的run()方法
  3. 创建一个线程对象
  4. 通过线程类对象调用start方法启动线程,启动线程之后会自动调用覆写的run方法执行线程
    **在main方法中使线程执行需要调用Thread中的start方法,如果不调用start方法的话线程是不会启动的。
    创建Thread实例,常用的两种构造方法

1:

 public Thread();//创建一个新的线程对象

2:

 public Thread(String threadname);//创建一个名为threadname的线程对象

继承Thread类创建一个新的线程的语法如下:

 public class  Thread子类的类名 extends Thread{
 }

下面介绍一个实例:

package THREAD;
class ThreadTest extends Thread {
    private int count = 10;
//重写run方法
    public void run() {
        while (true) {
            System.out.print(count + " ");
            if (--count == 0) {
                break;
            }
        }
    }
    public static class first {
        public static void main(String[] args) {
          Thread test = new ThreadTest();//创建一个线程对象
            test.start();//这段代码会瞬间执行,告诉jvm再分配一个新的栈给线程t
            /*
            有了多线程以后main方法结束,即使主方法线程没有方法栈帧了
            可能会有其他线程和其他栈中的栈帧
            main方法结束程序可能还在执行
             */
        }
    }
}

输出结果是:

 
10 9 8 7 6 5 4 3 2 1 
Process finished with exit code 0

**理解:**其实完成线程的真正功能代码是放在类的run()方法中,当一个类继承Thread类时,就可以在该类中重写run()方法,将实现该功能的代码放在run()方法中,然后同时调用Thread类中的start()方法执行线程,也就是所谓的调用run()方法 ,但是start()调用一个以及启动的线程的话
,系统就会抛出ILLegalThreadStateException异常。
当执行一个程序时,会自动执行一个线程,main()就是在这个线程上运行的,这个线程是由java虚拟机负责的,程序员调用自己的线程就是调用start()方法。

2:实现Runnable接口

上一个方法只能继承Thread,java语言不支持多继承,但是要当前类实现多线程,那么可以使用Runnable接口来实现。
实现Runnable接口的语法如下:

 public class Thread extends Object implements Runnable{
 }

**事实上我们可以查询API,实质上是Thread类实现了Runnable接口,其中的run()方法就是对runnable接口中的run()方法的具体实现。
Runnable接口中只有一个run()方法,它非Thread类子类的类提供的一种激活方式。一个类实现Runnable接口后,并不代表该类是一个“线程”类,不能直接运行,必须通过Thread实例才能创建并运行线程。
通过Runnable接口创建线程的步骤如下:
1、定义实现Runnable接口的类,并实现该类中的run()方法。
2、建立一个Thread对象,并将实现的Runnable接口的类的对象作为参数传入Thread类的构造方法。
3、通过Thread类中的start()方法启动线程,并运行。
流程图如下:
创建一个类去实现runnable类——>然后创建这个类的对象——>创建一个Thread类的对象——>将上面实现runnable的类的对象作为参数传给Thread的构造方法——>然后通过Thread的对象调用start()方法
注:直接调用Thread类或Runnable类对象的run()方法是无法启动线程的,这只是一个简单的方法调用必须通过Thread方法中的start()才行。
*/
下面写一段代码来实现一下:

class RenWu implements Runnable{
    //重写run()方法
    public void run()
    {
        //获取当前线程的名字
        System.out.println("当前线程:"+Thread.currentThread().getName());
//Thread.currentThread()获取当前对象
        for(int i=0;i<30;i++)
        {
            System.out.print("A");
        }
    }
}
public  class Run{
    public static  void main(String[] args) {
        //创建一个任务对象
        RenWu rw = new RenWu();
        //将实现的Runnable类的实例传入构造函数
        Thread thread = new Thread(rw);
        thread.start();
        thread.setName("t1");//给当前线程改名
        //获取主线程的名字
        System.out.println("主线程:[" + Thread.currentThread().getName() + "]");
       /* for(int i=0;i<30;i++)
        {
            System.out.println("C");
        }
    */
    }
}

输出结果为:

主线程:[main]
当前线程:t1
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
Process finished with exit code 0
发布了16 篇原创文章 · 获赞 34 · 访问量 1102

猜你喜欢

转载自blog.csdn.net/qq_42678668/article/details/103153098