Java多线程

(一)概念

一、线程是什么

⼀个线程就是⼀个"执⾏流",每个线程之间都可以按照顺序执行自己的代码,多个线程之间"同时"执行着多份代码。

二、进程和线程的区别

  • 进程是包含线程的。每个进程至少有⼀个线程存在,即主线程。
  • 进程和进程之间不共享内存空间。同⼀个进程的线程之间共享同⼀个内存空间。
  • 进程是系统分配资源的最小单位,线程是系统调度的最小单位。
  • ⼀个进程挂了⼀般不会影响到其他进程。但是⼀个线程挂了,可能把同进程内的其他线程⼀起带⾛(整个进程崩溃)。

三、Java 的线程和操作系统线程的关系

线程是操作系统中的概念。操作系统内核实现了线程这样的机制,并且对用户层提供了⼀些 API 供用户使用(例如 Linux 的 pthread 库)。

Java 标准库中 Thread 类可以视为是对操作系统提供的 API 进行了进⼀步的抽象和封装。

(二)创建线程

方法1:继承Thread类

  • 创建一个继承自 Thread 类的子类;
  • 重写 Thread 类的 run() 方法,在该方法中编写线程要执行的任务;
  • 创建子类的实例对象,并调用 start() 方法启动线程。
class MyThread extends Thread {
 @Override
 public void run() {
 System.out.println("这⾥是线程运⾏的代码");
 }
}

public class Main { 
    public static void main(String[] args) { 
        MyThread t = new MyThread(); 
        t.start();        
    } 
}

优点:实现简单,无需创建额外的类,可直接通过继承来定义线程要执行的任务。
缺点:由于 Java 是单继承的,如果已经继承了其他类,则无法再使用这种方式创建线程。

方法2:实现Runnable 接口

  • 创建一个实现了 Runnable 接口的类;
  • 实现接口中的 run() 方法,定义线程要执行的任务;
  • 创建该类的实例对象,并将其传递给 Thread 类的构造函数;
  • 调用 Thread 对象的 start() 方法启动线程。
class MyRunnable implements Runnable { 
    @Override 
    public void run() { 
        System.out.println("这是通过实现Runnable接口创建的线程在执行"); 
    }
} 
 
public class Main { 
    public static void main(String[] args) { 
        Thread thread = new Thread(new MyRunnable()); 
        thread.start(); 
    } 
}

优点:适用于多线程共享同一个实例的情况,并且因为 Java 不支持多重继承,当类已经继承了其他类时,仍可通过实现该接口创建线程。
缺点:如果需要访问当前线程,必须调用 Thread.currentThread() 方法。 

方法3:使用匿名类

可以使用匿名类直接创建线程,适用于任务较为简单的情况。

public class Main { 
    public static void main(String[] args) { 
        Thread thread = new Thread() { 
            @Override 
            public void run() { 
                System.out.println("这是匿名类创建的线程在执行"); 
            }
        }; 
        thread.start(); 
    } 
}

优点:代码简洁,适用于一次性、简单的线程任务。
缺点:如果匿名类代码过长,会导致代码可读性变差 。

你可能感兴趣的:(java,jvm,开发语言)