c语言编程笔录

首页 >   > 笔记大全

笔记大全

一文带你读懂Java中的线程

更新时间:2024-01-06

一文带你读懂Java中的线程

Java中的线程是多任务处理的一种机制,可以同时执行多个任务。每个线程都有一个优先级,Java线程的调度器使用线程的优先级来确定哪个线程将优先执行。在本文中,我们将讨论Java中线程的概念、创建和管理线程、线程同步和线程池。

什么是线程?

线程是程序执行流的最小单元。线程通常指的是一个进程内部的并发执行路径。每个线程都有自己的栈、程序计数器(Program Counter)和局部变量,但共享进程的内存和此进程所打开文件的句柄。线程的创建方式有两种:继承Thread类,实现Runnable接口。

    public class MyThread extends Thread {
      public void run() {
        System.out.println("MyThread running");
      }
    }
    public class MainClass {
      public static void main(String args[]) {
        MyThread myThread=new MyThread();
        myThread.start();
      }
    }
  

以上是通过继承Thread类创建线程的代码。可以看到,线程的启动是通过start()方法实现的。start()方法是一个native方法,它启动了一个线程并调用run()方法。

如何创建线程?

除了继承Thread类创建线程,还可以通过实现Runnable接口来创建线程。Runnable接口仅包含一个run()方法,该方法不返回任何值,仅仅是执行一些操作。

    public class MyRunnable implements Runnable {
      public void run() {
        System.out.println("MyRunnable running");
      }
    }
    public class MainClass {
      public static void main(String args[]) {
        MyRunnable myRunnable=new MyRunnable();
        Thread thread=new Thread(myRunnable);
        thread.start();
      }
    }
  

以上是通过实现Runnable接口创建线程的代码。创建Runnable实例后,需要通过Thread类创建一个线程并将Runnable实例作为参数传递给Thread构造函数。

线程同步和互斥

当多个线程访问共享数据时,可能发生线程安全问题。Java提供了synchronized关键字来解决这种问题。一个线程获得一个对象的锁时,其他试图获得该对象锁的线程将被阻塞。当获得锁的线程释放锁时,其他线程将会继续尝试获得锁。

    public class Counter {
      private int count=0;
      public synchronized void increment() {
        count++;
      }
      public synchronized void decrement() {
        count--;
      }
      public synchronized int getCount() {
        return count;
      }
    }
  

以上是一个线程安全的计数器类。通过synchronized关键字,确保每次只有一个线程能够访问count变量。这样,多个线程对count变量的操作将会互斥,防止线程安全问题。

线程池

线程池是一种管理和复用线程的机制。Java中的线程池是通过ThreadPoolExecutor类实现的。线程池中的线程可以被多个任务复用,因此减少了线程的创建和销毁的开销。线程池中的线程数量可以根据需要自动调整。

    Runnable myRunnable=new Runnable() {
      public void run() {
        System.out.println("MyRunnable running in ThreadPool");
      }
    };
    ExecutorService executor=Executors.newFixedThreadPool(3);
    executor.execute(myRunnable);
    executor.shutdown();
  

以上是使用线程池执行任务的代码。首先创建了一个Runnable实例,然后使用ThreadPoolExecutor类创建了一个固定大小为3的线程池。通过submit()方法将任务提交到线程池中,然后使用shutdown()方法关闭线程池。

总结

Java中的线程是多任务处理的一种机制。可以通过继承Thread类或实现Runnable接口来创建线程。线程同步和互斥可以通过synchronized关键字来实现。线程池是一种管理和复用线程的机制,通过ThreadPoolExecutor类实现。