共计 3150 个字符,预计需要花费 8 分钟才能阅读完成。
在本节中,咱们将具体探讨 Java 中的线程创立与治理,包含创立线程的办法、线程生命周期、线程优先级等。咱们将通过实例来解说每个知识点,确保你可能全面了解。
5.1.1 什么是线程?
线程是程序中的执行单元,是操作系统调度的根本单位。在 Java 中,多线程指的是在同一时间内,一个程序能够执行多个工作。多线程编程能够进步程序的执行效率,充沛利用计算机资源。
5.1.2 创立线程的两种办法
在 Java 中,创立线程有两种办法:
- 继承
java.lang.Thread
类 - 实现
java.lang.Runnable
接口
5.1.2.1 继承 Thread 类
要应用继承 Thread
类的办法创立线程,咱们须要:
- 创立一个类,继承
Thread
类。 - 重写
run()
办法,在该办法中编写具体的工作逻辑。 - 实例化该类的对象,并调用
start()
办法启动线程。
示例:
// 创立一个类,继承 Thread 类
class MyThread extends Thread {
@Override
public void run() {// 在 run()办法中编写工作逻辑
for (int i = 0; i < 5; i++) {System.out.println("MyThread:" + i);
}
}
}
public class ThreadExample {public static void main(String[] args) {// 实例化 MyThread 对象,并调用 start()办法启动线程
MyThread myThread = new MyThread();
myThread.start();}
}
5.1.2.2 实现 Runnable 接口
要应用实现 Runnable
接口的办法创立线程,咱们须要:
- 创立一个类,实现
Runnable
接口。 - 重写
run()
办法,在该办法中编写具体的工作逻辑。 - 实例化该类的对象,将对象作为参数传递给
Thread
类的构造方法。 - 调用
Thread
对象的start()
办法启动线程。
示例:
// 创立一个类,实现 Runnable 接口
class MyRunnable implements Runnable {
@Override
public void run() {// 在 run()办法中编写工作逻辑
for (int i = 0; i < 5; i++) {System.out.println("MyRunnable:" + i);
}
}
}
public class RunnableExample {public static void main(String[] args) {
// 实例化 MyRunnable 对象,将对象作为参数传递给 Thread 类的构造方法
MyRunnable myRunnable = new MyRunnable();
Thread thread = new Thread(myRunnable);
// 调用 Thread 对象的 start()办法启动线程
thread.start();}
}
5.1.3 线程生命周期
线程有五种状态:
- 新建(New):线程对象被创立后,处于新建状态。
- 就绪(Runnable):当线程对象调用
start()
办法后,线程进入就绪状态。处于就绪状态的线程有可能正在运行,也有可能正在期待零碎分配资源。 - 运行(Running):当线程取得系统资源,开始执行
run()
办法中的代码时,线程处于运行状态。 - 阻塞(Blocked):当线程因某种原因(如期待 I / O 操作实现、期待获取锁等)而临时进行执行时,线程处于阻塞状态。
- 死亡(Terminated):当线程执行完
run()
办法中的代码或者因异样而终止时,线程处于死亡状态。
5.1.4 线程优先级
Java 中的线程具备优先级,优先级高的线程有更大的机会取得执行。线程优先级的范畴是 1 到 10,其中 1 示意最低优先级,10 示意最高优先级,5 示意默认优先级。能够应用 Thread
类的 setPriority(int newPriority)
办法设置线程优先级,应用 getPriority()
办法获取线程优先级。
示例:
class PriorityThread extends Thread {public PriorityThread(String name) {super(name);
}
@Override
public void run() {for (int i = 0; i < 5; i++) {System.out.println(getName() + ":" + i);
}
}
}
public class ThreadPriorityExample {public static void main(String[] args) {PriorityThread lowPriorityThread = new PriorityThread("LowPriority");
PriorityThread highPriorityThread = new PriorityThread("HighPriority");
// 设置线程优先级
lowPriorityThread.setPriority(Thread.MIN_PRIORITY); // 最低优先级
highPriorityThread.setPriority(Thread.MAX_PRIORITY); // 最高优先级
lowPriorityThread.start();
highPriorityThread.start();}
}
在上述示例中,咱们创立了两个线程,一个具备最低优先级,另一个具备最高优先级。须要留神的是,线程优先级不能保障线程的执行程序,它只是进步了线程取得执行的机会。
5.1.5 线程同步与互斥
在多线程环境下,多个线程可能会访问共享资源,这可能导致数据不统一的问题。为了解决这个问题,咱们须要应用线程同步与互斥机制来确保同一时刻只有一个线程能够访问共享资源。
Java 提供了 synchronized
关键字来实现线程同步。咱们能够应用 synchronized
润饰办法或者在办法外部应用 synchronized
代码块。
示例:应用 synchronized
润饰办法
class Counter {
private int count;
public synchronized void increment() {count++;}
public synchronized void decrement() {count--;}
public synchronized int getCount() {return count;}
}
示例:应用 synchronized
代码块
class Counter {
private int count;
public void increment() {synchronized (this) {count++;}
}
public void decrement() {synchronized (this) {count--;}
}
public int getCount() {synchronized (this) {return count;}
}
}
5.1.6 小结
通过本节的学习,咱们理解了 Java 中线程的基本概念、创立办法、生命周期、优先级以及同步与互斥。多线程编程是 Java 高级开发的重要内容,须要多加练习和深刻了解。
请务必把握以下重点:
- 线程的概念及作用。
- 创立线程的两种办法:继承
Thread
类和实现Runnable
接口。 - 线程生命周期的五种状态:新建、就绪、运行、阻塞、死亡。
- 线程优先级的设置与获取。
- 线程同步与互斥的实现形式:应用
synchronized
关键字。
练习:尝试创立一个多线程程序,模仿多个售票窗口售卖火车票的过程。在这个过程中,须要留神线程同步与互斥问题,确保票数的正确性。
举荐浏览:
https://mp.weixin.qq.com/s/dV2JzXfgjDdCmWRmE0glDA
https://mp.weixin.qq.com/s/an83QZOWXHqll3SGPYTL5g