您的位置:

Java Thread编程指南

Java是一种高性能、跨平台、面向对象的语言。在Java编程中,线程是一个非常重要的概念。线程可以使代码并发执行,提高应用程序的并发性和性能。本文将从多个方面对Java线程进行阐述。

一、线程的创建

Java中线程的创建方式有两种:继承Thread类、实现Runnable接口。


//继承Thread类
class MyThread extends Thread {
    public void run() {
        //线程执行代码
    }
}
MyThread thread = new MyThread();
thread.start();

//实现Runnable接口
class MyRunnable implements Runnable {
    public void run() {
        //线程执行代码
    }
}
MyRunnable runnable = new MyRunnable();
Thread thread = new Thread(runnable);
thread.start();

在使用继承Thread类的方式创建线程时,需要重写run()方法,在该方法中编写线程的执行代码。使用实现Runnable接口的方式创建线程时,需要先定义一个实现Runnable接口的类。在该类中,同样需要实现run()方法。线程的启动通过调用start()方法实现。

二、线程的状态

Java中线程的状态有6种:新建、就绪、运行、阻塞、等待、终止。

  • 新建状态:当创建一个线程对象时,线程处于新建状态。
  • 就绪状态:当调用start()方法后,线程进入就绪状态。
  • 运行状态:线程被分配CPU时间片并执行run()方法后,进入运行状态。
  • 阻塞状态:线程被某些原因阻塞,如等待输入输出、调用sleep()方法等,进入阻塞状态。
  • 等待状态:当线程等待某个条件时,进入等待状态。
  • 终止状态:如果run()方法执行完毕或者调用stop()方法后,线程进入终止状态。

三、线程的同步

Java中多个线程访问共享数据时,可能会出现数据不一致等问题,这就需要进行线程的同步。

Java中线程同步的方式主要有三种:synchronized关键字、wait()和notify()方法、Lock和Condition接口。

synchronized关键字的使用:


class MyThread extends Thread {
    public void run() {
        synchronized (this) {
            //线程执行代码
        }
    }
}

在synchronized关键字块内的代码,同一时间只能有一个线程执行。

wait()和notify()方法进行线程同步:


class MyThread extends Thread {
    public void run() {
        synchronized (this) {
            try {
                this.wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            //线程执行代码
        }
    }
}
class MyNotifyThread extends Thread {
    private Object obj;
    public MyNotifyThread(Object obj) {
        this.obj = obj;
    }
    public void run() {
        synchronized (obj) {
            obj.notify();
        }
    }
}
MyThread thread = new MyThread();
MyNotifyThread notifyThread = new MyNotifyThread(thread);
notifyThread.start();

在wait()方法内的线程将进入等待状态,只有当其他线程调用notify()方法时,该线程才会被唤醒。

Lock和Condition进行线程同步:


Lock lock = new ReentrantLock();
Condition condition = lock.newCondition();
class MyThread extends Thread {
    public void run() {
        lock.lock();
        try {
            //线程执行代码
            condition.signal();
        } finally {
            lock.unlock();
        }
    }
}
class MyWaitThread extends Thread {
    private Lock lock;
    private Condition condition;
    public MyWaitThread(Lock lock, Condition condition) {
        this.lock = lock;
        this.condition = condition;
    }
    public void run() {
        lock.lock();
        try {
            condition.await();
            //线程执行代码
        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally {
            lock.unlock();
        }
    }
}
MyThread thread = new MyThread();
MyWaitThread waitThread = new MyWaitThread(lock, condition);
waitThread.start();
thread.start();

使用Lock和Condition进行线程同步时,需要先定义一个Lock对象,并根据该Lock对象创建一个Condition对象。在代码中,需要先获取Lock锁,执行完业务代码后,使用Condition的signal()方法唤醒等待的线程。在等待线程中,需要在获取Lock锁后,使用Condition的await()方法进入等待状态。