知识点总结
-
实现 Runnable 接口:通过实现
Runnable
接口,一个类可以定义其线程执行的任务。这是创建线程的一种方式,相比直接继承Thread
类,这种方式更加灵活,因为 Java 只支持单继承。 -
线程同步:使用
synchronized
关键字可以创建同步代码块,确保同一时间只有一个线程可以执行该代码块。这是解决多线程访问共享资源时可能出现的竞争条件(race condition)和数据不一致问题的一种常用方法。 -
线程休眠:
Thread.sleep(long millis)
方法使当前线程休眠指定的毫秒数。这可以用于模拟耗时操作,或简单地让出CPU时间片,以便其他线程可以运行。 -
异常处理:在多线程编程中,处理可能抛出的异常(如
InterruptedException
)是很重要的,以确保程序的健壮性和稳定性。 -
共享资源访问:在多线程环境中,访问和修改共享资源(如本例中的
tickets
变量)需要特别小心,以避免数据不一致和竞争条件。 -
无限循环:在某些情况下(如服务器或持续运行的任务),使用无限循环是合理的。然而,必须确保有适当的退出机制,以避免资源泄露或程序挂起。
实现代码:
/**
* 线程类
*/
public class SellTickets implements Runnable{
private int tickets = 100; //一共100张特价门票
@Override
public void run() {
while (true){
//还有没有票
synchronized (this){//同步语句块可以解决线程安全问题
if (this.tickets > 0){
System.out.println(Thread.currentThread().getName() + "正在出售第 -" + this.tickets +
"- 张特价票");
//库存变化
this.tickets--;
}
}
try {
Thread.sleep(50);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
/**
* 卖票测试类
*/
public class SellTicketsTest {
public static void main(String[] args) {
SellTickets st = new SellTickets();
Thread window01 = new Thread(st,"文化宫");
Thread window02 = new Thread(st,"潘家园");
Thread window03 = new Thread(st,"回龙观");
window01.start();
window02.start();
window03.start();
}
}
运行: