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()方法进入等待状态。