让我来为你详细讲解“Java 多线程实例详解(三)”的完整攻略。
什么是Java多线程
在学习Java多线程之前,我们先来了解一下什么是多线程。线程是操作系统中进程内的一个独立执行单元,也是程序开发中实现多任务并发的一种手段。多线程可以提高程序的处理能力和运行效率。
在Java中,多线程可以通过线程类Thread来实现。一个Java应用程序从main()方法开始执行,是一个由操作系统构建的进程。在这个进程中有一个主线程,这个主线程可以在自己的 虚拟机中产生多个线程,主线程和其他线程同时执行。
如何创建线程
Java创建线程有两种方式:
- 继承Thread类并重写run()方法
- 实现Runnable接口并通过Thread类进行实例化
下面分别介绍这两种方式。
继承Thread类
继承Thread类并重写run()方法是实现多线程的最基本方法。具体步骤如下:
- 继承Thread类。
- 重写run()方法,在run()方法中实现线程的逻辑。
- 创建线程对象,调用start()方法启动线程。
示例一:
public class MyThread extends Thread{
@Override
public void run() {
System.out.println("MyThread is running...");
}
}
public class Main{
public static void main(String[] args) {
MyThread myThread = new MyThread();
myThread.start();
}
}
在这个示例中,MyThread类继承了Thread类,并重写了run()方法,在run()方法中打印了一条语句。Main类创建了一个MyThread对象并通过调用start()方法启动了一个新线程。
实现Runnable接口
另一种创建线程的方式是实现Runnable接口。具体步骤如下:
- 实现Runnable接口,重写run()方法,在run()方法中实现线程的逻辑。
- 创建Runnable实例。
- 创建Thread对象,将Runnable实例作为参数传入构造方法中。
- 调用Thread对象的start()方法启动线程。
示例二:
public class MyRunnable implements Runnable{
@Override
public void run() {
System.out.println("MyRunnable is running...");
}
}
public class Main{
public static void main(String[] args) {
MyRunnable myRunnable = new MyRunnable();
Thread thread = new Thread(myRunnable);
thread.start();
}
}
在这个示例中,MyRunnable实现了Runnable接口,并重写了run()方法,在run()方法中打印了一条语句。Main类创建MyRunnable实例,并创建一个Thread对象,在Thread对象的构造方法中将MyRunnable实例作为参数传入。
线程的状态
在Java多线程中,线程有以下几种状态:
- 新建状态:创建了线程对象,但还没有调用start()方法。
- 运行状态:线程调用了start()方法,线程开始执行。
- 阻塞状态:线程等待某个资源或等待条件达成,暂停执行。
- 等待状态:线程等待其他线程执行某些操作。
- 守护状态:守护线程是在后台运行的线程,它不会影响程序的运行。
线程同步
在多线程环境下,线程之间的执行可能会产生竞态条件(Race Condition)和死锁(Deadlock)等问题,这些问题都需要通过线程同步来解决。
Java提供了多种线程同步的方法,包括synchronized关键字、wait()和notify()方法、Lock接口等。
下面以synchronized关键字为例,讲解线程同步和锁的机制。synchronized关键字用于保证多个线程不会同时访问某一段代码,具体实现方式有以下两种:
- synchronized方法:将synchronized关键字加在方法定义上。
- synchronized代码块:将synchronized关键字加在代码块中。
示例三:
public class Counter {
private int count = 0;
public synchronized void add(int n) {
count += n;
System.out.println(Thread.currentThread().getName() + " add " + n + ", count=" + count);
}
}
public class AddThread extends Thread {
private Counter counter;
private int number;
public AddThread(Counter counter, int number) {
this.counter = counter;
this.number = number;
}
@Override
public void run() {
for(int i = 0; i < 10; i++) {
counter.add(number);
}
}
}
public class Main {
public static void main(String[] args) {
Counter counter = new Counter();
new AddThread(counter, 1).start();
new AddThread(counter, 2).start();
}
}
在这个示例中,Counter类有一个add()方法,用于对count进行加法操作。AddThread类继承了Thread类,并在run()方法中多次调用Counter的add()方法。Main类创建了两个AddThread对象。
需要注意的是,我们在add()方法上使用了synchronized关键字,这表示在add()方法内部只能够有一个线程执行,其他线程必须等待该线程执行完毕。这样就可以保证多个线程对count的操作不会产生竞态条件。
总结
以上就是Java 多线程实例详解的完整攻略,我们首先了解了多线程的基本概念以及如何创建线程;其次介绍了线程状态和线程同步的相关知识。通过示例的方式,我们可以更好地理解这些概念的具体实现方式。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java 多线程实例详解(三) - Python技术站