Java多线程实现方式

一.多线程的实现方式

线程的两种实现方式:继承Thread类,实现Runnable接口

1.继承Thread
 1 package demo;
 2 
 3 public class Test {
 4     public static void main(String[] args) {
 5         MyThread m=new MyThread();
 6         m.start();
 7         for (int i=0;i<10;i++){
 8             System.out.println("main主线程"+i);
 9         }
10     }
11 }
12 package demo;
13 
14 public class MyThread extends  Thread{
15     /**
16      *
17      * run方法就是线程要执行任务的方法
18      */
19     @Override
20     public void run() {
21         //这里的代码就是一条新的执行路径
22         //这个执行路径的触发方式,不是调用run方法,而是通过thread对象的start()来启动
23         for (int i=0;i<10;i++){
24             System.out.println("run方法执行了"+i);
25         }
26     }
27 }
28 要点:继承Thread类,重写run方法,在run方法内编写代码实现业务。通过Thread实例的start方法启动多线程。
2.实现Runnable接口
 1 package demo;
 2 
 3 /**
 4  * 用于给线程执行的任务
 5  */
 6 public class MyRunnable implements Runnable {
 7 
 8     @Override
 9     public void run() {
10         //线程的任务
11         for (int i=0;i<10;i++){
12             System.out.println("run方法执行了"+i);
13         }
14     }
15 }
16 package demo;
17 
18 public class Test {
19     public static void main(String[] args) {
20          //实现Runnable
21         //1.创建一个任务对象
22         MyRunnable r=new MyRunnable();
23         //2、创建一个线程,为其分配一个任务
24         Thread t=new Thread(r);
25         //3.执行这个线程
26         t.start();
27         for (int i=0;i<10;i++){
28             System.out.println("main主线程"+i);
29         }
30     }
31 }
32 要点:实现Runnable接口,实现run方法,在run方法内编写代码实现业务。通过Thread(new Runnable实现类)构造函数,构造Thread,通过Thread实例的start方法启动多线程。Runnable就是任务。

二.Thread 和 Runnable 的不同点

Runnable是接口;

Thread 是类,Thread本身是实现了Runnable接口的类;

我们知道“一个类只能有一个父类,但是却能实现多个接口”,因此Runnable具有更好的扩展性。

此外,Runnable还可以用于“资源的共享”。即,多个线程都是基于某一个Runnable对象建立的,它们会共享Runnable对象上的资源。

通常,建议通过“Runnable”实现多线程!

三. Runnable 与Thread相比,有如下优势

1.通过创建任务,给线程分配任务的方式来实现额多线程,更适合多个线程同时执行相同任务的情况

2.可以避免单继承所带来的局限性

3.任务与线程本身是分离的,提高了程序的健壮性

4.后续学习的线程池技术,接受Runnable类型的任务,不接收Thread类型的线程

四.为什么线程通过start启动,而不是run方法启动

查看Thread源码中的start方法

Thread调用start方法时,会启动start0()方法,而start0()是一个native方法,此时然后java虚拟机则会调用run方法,启动另外一个线程,

而当前start方法继续执行,这时有两个线程同时运行,当start()方法执行完成之后,线程start方法执行结束,该线程不可以重新启动。

继续看run方法,如果是线程本身是通过实现Runnable接口构建的,那么调用Runnable的run方法,否则调用重写了run方法的Thread类的方法。

所以,只可以通过start方法启动线程,而调用run方法时,只是调用run方法而已,不会启动另外一个线程。

一旦涉及到多线程需要解决的问题,一般会有共享资源,那么尽量采用实现Runnable接口的实现方式,可以在多线程之间共享资源。

posted @ 2021-10-17 12:37  SumerWine  阅读(53)  评论(0编辑  收藏  举报