欢迎来到Java核心类库的学习篇!在前面的章节中,我们探讨了字符串处理、常用数据结构、异常处理机制和输入输出操作的相关知识。在本节中,我们将深入了解Java的多线程编程。多线程编程是一种在程序中并发执行多个线程的方法,它能够显著提高程序的执行效率和响应速度。通过学习Java的多线程机制,你将掌握如何编写并发程序,管理线程的生命周期,并实现线程间的协调和通信。
线程的基本概念
线程是程序执行的最小单位,每个线程都有自己的执行路径。Java通过‘java.lang.Thread‘类和‘java.lang.Runnable‘接口来实现多线程编程。
什么是进程和线程
- 进程:操作系统中独立运行的程序,每个进程有自己的内存空间和系统资源。
- 线程:进程中的独立执行路径,同一进程中的线程共享内存空间和系统资源。
创建线程
在Java中,可以通过继承‘Thread‘类或实现‘Runnable‘接口来创建线程。
继承Thread类
示例:
public class Main {
public static void main(String[] args) {
MyThread thread = new MyThread();
thread.start();
}
}
class MyThread extends Thread {
@Override
public void run() {
System.out.println("Thread is running.");
}
}
实现Runnable接口
示例:
public class Main {
public static void main(String[] args) {
MyRunnable runnable = new MyRunnable();
Thread thread = new Thread(runnable);
thread.start();
}
}
class MyRunnable implements Runnable {
@Override
public void run() {
System.out.println("Thread is running.");
}
}
线程的生命周期
线程的生命周期包括以下几个阶段:
- 新建(New):线程对象被创建,但尚未启动。
- 就绪(Runnable):线程已启动,等待CPU分配时间片。
- 运行(Running):线程正在执行。
- 阻塞(Blocked):线程因等待某个条件而暂停执行,如等待I/O操作或获取锁。
- 终止(Terminated):线程执行完毕或因异常退出。
线程的优先级
每个线程都有一个优先级,Java提供了从‘Thread.MIN_PRIORITY‘(1)到‘Thread.MAX_PRIORITY‘(10)的10个优先级。线程的默认优先级为‘Thread.NORM_PRIORITY‘(5)。
示例:
public class Main {
public static void main(String[] args) {
Thread thread1 = new Thread(new MyRunnable());
thread1.setPriority(Thread.MAX_PRIORITY);
Thread thread2 = new Thread(new MyRunnable());
thread2.setPriority(Thread.MIN_PRIORITY);
thread1.start();
thread2.start();
}
}
class MyRunnable implements Runnable {
@Override
public void run() {
System.out.println("Thread is running with priority: " + Thread.currentThread().getPriority());
}
}
线程同步
线程同步用于防止多个线程同时访问共享资源,导致数据不一致。Java提供了‘synchronized‘关键字来实现线程同步。
同步方法
示例:
public class Main {
public static void main(String[] args) {
Counter counter = new Counter();
Thread thread1 = new Thread(new MyRunnable(counter));
Thread thread2 = new Thread(new MyRunnable(counter));
thread1.start();
thread2.start();
}
}
class Counter {
private int count = 0;
public synchronized void increment() {
count++;
System.out.println("Count: " + count);
}
}
class MyRunnable implements Runnable {
private Counter counter;
public MyRunnable(Counter counter) {
this.counter = counter;
}
@Override
public void run() {
for (int i = 0; i < 10; i++) {
counter.increment();
}
}
}
同步块
示例:
public class Main {
public static void main(String[] args) {
Counter counter = new Counter();
Thread thread1 = new Thread(new MyRunnable(counter));
Thread thread2 = new Thread(new MyRunnable(counter));
thread1.start();
thread2.start();
}
}
class Counter {
private int count = 0;
public void increment() {
synchronized (this) {
count++;
System.out.println("Count: " + count);
}
}
}
class MyRunnable implements Runnable {
private Counter counter;
public MyRunnable(Counter counter) {
this.counter = counter;
}
@Override
public void run() {
for (int i = 0; i < 10; i++) {
counter.increment();
}
}
}
线程通信
Java提供了‘wait()‘、‘notify()‘和‘notifyAll()‘方法来实现线程间的通信。
示例:
public class Main {
public static void main(String[] args) {
Message message = new Message();
Thread thread1 = new Thread(new Producer(message));
Thread thread2 = new Thread(new Consumer(message));
thread1.start();
thread2.start();
}
}
class Message {
private String content;
private boolean empty = true;
public synchronized void produce(String content) {
while (!empty) {
try {
wait();
}
catch (InterruptedException e) {
e.printStackTrace();
}
}
empty = false;
this.content = content;
System.out.println("Produced: " + content);
notifyAll();
}
public synchronized String consume() {
while (empty) {
try {
wait();
}
catch (InterruptedException e) {
e.printStackTrace();
}
}
empty = true;
System.out.println("Consumed: " + content);
notifyAll();
return content;
}
}
class Producer implements Runnable {
private Message message;
public Producer(Message message) {
this.message = message;
}
@Override
public void run() {
String[] contents = {"message1", "message2", "message3"};
for (String content : contents) {
message.produce(content);
try {
Thread.sleep(500);
}
catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
class Consumer implements Runnable {
private Message message;
public Consumer(Message message) {
this.message = message;
}
@Override
public void run() {
for (int i = 0; i < 3; i++) {
message.consume();
try {
Thread.sleep(1000);
}
catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
总结
在本篇博客中,我们详细介绍了Java的多线程编程。从线程的基本概念、创建线程的方法、线程的生命周期和优先级,到线程同步和线程通信,通过这些知识的学习,你将能够编写并发程序,管理线程的生命周期,并实现线程间的协调和通信。多线程编程是Java编程中非常重要的一部分,掌握这些技巧能够帮助你开发高效且响应迅速的应用程序。在接下来的学习中,我们将继续探讨Java核心类库中的其他重要内容,帮助你全面掌握Java编程技能。祝你学习愉快,不断进步!


686

被折叠的 条评论
为什么被折叠?



