Java小白-线程相关

一、线程的创建方式

1. 继承Thread

  • 通过创建一个类继承Thread类,并重写其run方法,然后在创建该类的实例时启动线程(调用start方法)。
  • 示例代码:
     
    class MyThread extends Thread {
        @Override
        public void run() {
            // 线程执行的代码
        }
    }
    
    public class Main {
        public static void main(String[] args) {
            MyThread thread = new MyThread();
            thread.start(); // 启动线程
        }
    }
    

2. 实现Runnable接口

  • 创建一个实现了Runnable接口的类,并实现其run方法,然后将该类的实例传递给Thread对象,并调用start方法启动线程。
  • 示例代码:
     
    class MyRunnable implements Runnable {
        @Override
        public void run() {
            // 线程执行的代码
        }
    }
    
    public class Main {
        public static void main(String[] args) {
            MyRunnable myRunnable = new MyRunnable();
            Thread thread = new Thread(myRunnable);
            thread.start(); // 启动线程
        }
    }
    

3. ‌Callable接口‌(注意:原query中的“Connable接口”应为笔误)

  • Callable接口与Runnable类似,但Callable可以返回结果并且可以抛出异常。
  • 需要使用FutureTask类来包装Callable对象,然后将其传递给Thread对象。
  • 示例代码:
     
    import java.util.concurrent.Callable;
    import java.util.concurrent.ExecutionException;
    import java.util.concurrent.FutureTask;
    
    class MyCallable implements Callable {
        @Override
        public String call() throws Exception {
            // 线程执行的代码,返回结果
            return "Hello, Callable!";
        }
    }
    
    public class Main {
        public static void main(String[] args) {
            MyCallable myCallable = new MyCallable();
            FutureTask futureTask = new FutureTask<>(myCallable);
            Thread thread = new Thread(futureTask);
            thread.start();
    
            try {
                // 获取线程执行结果
                String result = futureTask.get();
                System.out.println(result);
            } catch (InterruptedException | ExecutionException e) {
                e.printStackTrace();
            }
        }
    }
    

二、线程的执行原理

  • 线程的执行依赖于操作系统的线程调度器,它负责将CPU资源分配给各个线程。
  • 当一个线程获得CPU资源时,它会执行其run方法中的代码,直到执行完毕或被中断。
  • 线程的执行是并发的,即多个线程可以在同一时间段内交替执行。

三、并发的执行原理

  • 并发是指多个线程同时执行,但实际上是CPU资源在多个线程之间循环切换,以实现“同时”执行的效果。
  • 并发执行依赖于操作系统的线程调度机制,以及Java虚拟机(JVM)对线程的管理。

四、线程的生命周期

  • 新建(New)‌:线程对象被创建,但尚未启动。
  • 就绪(Runnable)‌:线程对象已启动,等待获取CPU资源。
  • 运行(Running)‌:线程正在执行其run方法中的代码。
  • 阻塞(Blocked)‌:线程因等待某个条件(如I/O操作、锁等)而暂停执行。
  • 等待(Waiting)‌:线程在等待另一个线程执行特定操作(如调用notifynotifyAll)。
  • 超时等待(Timed Waiting)‌:线程在等待另一个线程执行特定操作,但有一个超时限制。
  • 终止(Terminated)‌:线程执行完毕或被中断。

五、并发与同步

  • 并发‌:多个线程同时执行,但实际上是CPU资源在多个线程之间循环切换。
  • 同步‌:用于保证多个线程在访问共享资源时的正确性。
  • synchronized关键字‌:用于实现线程同步,可以修饰方法或代码块。当某个线程进入synchronized修饰的方法或代码块时,其他线程将无法进入,直到该线程执行完毕并释放锁。

六、线程的休眠与通信

  • 休眠‌:使用Thread.sleep(long millis)方法使线程休眠指定的毫秒数。休眠期间,线程不会执行任何操作,也不会释放锁(如果有的话)。
  • 通信‌:线程之间可以通过共享变量、wait/notify/notifyAll机制、BlockingQueue等方式进行通信。

七、单例模式与线程安全

  • 单例模式‌:确保一个类只有一个实例,并提供一个全局访问点。
  • 线程安全的单例模式‌:在多线程环境下,确保单例模式的正确性。可以使用synchronized关键字、双重检查锁定(Double-Checked Locking)、静态内部类等方式实现线程安全的单例模式。

(注:单例模式的详细实现和线程安全性的讨论超出了本笔记的范围,但提供了相关链接供进一步学习。)

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