Java线程创建和线程同步是多线程编程必须掌握的核心知识点。下面将介绍Java线程创建和线程同步的实现示例。
Java线程创建的实现示例
Java线程创建通常有两种方式:继承Thread类和实现Runnable接口。
继承Thread类的实现示例
代码示例:
public class TicketSeller extends Thread {
private static int tickets = 100; // 票数
@Override
public void run() {
while (true) {
synchronized (this) { // 加锁,确保线程安全
if (tickets > 0) {
System.out.println(Thread.currentThread().getName() + "售出第" + tickets + "张票");
tickets--;
} else {
System.out.println("票已售完");
break;
}
}
}
}
}
// 启动线程
public static void main(String[] args) {
TicketSeller ts1 = new TicketSeller();
TicketSeller ts2 = new TicketSeller();
ts1.setName("窗口1");
ts2.setName("窗口2");
ts1.start();
ts2.start();
}
说明:
- TicketSeller类继承自Thread类,并重写了run()方法。在run()方法中,使用synchronized关键字加锁,确保线程安全。
- main方法中,创建了两个线程ts1和ts2,并分别启动。通过setName()方法为线程命名,方便调试和排查线程问题。
实现Runnable接口的实现示例
代码示例:
public class TicketRunnable implements Runnable {
private static int tickets = 100; // 票数
@Override
public void run() {
while (true) {
synchronized (this) { // 加锁,确保线程安全
if (tickets > 0) {
System.out.println(Thread.currentThread().getName() + "售出第" + tickets + "张票");
tickets--;
} else {
System.out.println("票已售完");
break;
}
}
}
}
}
// 启动线程
public static void main(String[] args) {
TicketRunnable tr = new TicketRunnable();
Thread ts1 = new Thread(tr);
Thread ts2 = new Thread(tr);
ts1.setName("窗口1");
ts2.setName("窗口2");
ts1.start();
ts2.start();
}
说明:
- TicketRunnable类实现了Runnable接口,并重写了run()方法。在run()方法中,使用synchronized关键字加锁,确保线程安全。
- main方法中,创建了一个Runnable实例tr,并分别创建了两个线程ts1和ts2,并将tr作为参数传入Thread的构造函数中。通过setName()方法为线程命名,方便调试和排查线程问题。
线程同步的实现示例
线程同步是指多个线程对同一共享资源进行访问时,为了避免数据的不一致,需要采取措施防止每个线程间冲突。Java中可以通过synchronized关键字控制线程同步。
卖包子的实现示例
代码示例:
public class Baozi {
private String type; // 包子类型
private boolean hasBaozi; // 是否有包子
public synchronized void produce(String type) { // 生产包子
if (hasBaozi) { // 如果有包子,则等待
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("正在生产" + type + "包子");
this.type = type;
hasBaozi = true;
notify(); // 生产成功,通知顾客
}
public synchronized String consume() { // 消费包子
if (!hasBaozi) { // 如果没有包子,则等待
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("正在消费" + type + "包子");
hasBaozi = false;
notify(); // 消费成功,通知厨师
return type;
}
}
// 生产包子的线程
public class Producer implements Runnable {
private Baozi baozi;
public Producer(Baozi baozi) {
this.baozi = baozi;
}
@Override
public void run() {
int count = 0;
while (true) {
if (count++ == 10) { // 生产10个包子后退出
break;
}
baozi.produce("肉");
}
}
}
// 消费包子的线程
public class Consumer implements Runnable {
private Baozi baozi;
public Consumer(Baozi baozi) {
this.baozi = baozi;
}
@Override
public void run() {
int count = 0;
while (true) {
if (count++ == 10) { // 消费10个包子后退出
break;
}
baozi.consume();
}
}
}
// 启动线程
public static void main(String[] args) {
Baozi baozi = new Baozi();
new Thread(new Producer(baozi)).start();
new Thread(new Consumer(baozi)).start();
}
说明:
- Baozi类封装了包子的生产和消费方法。当还有包子时,生产线程进入等待状态,等待消费线程消费后通知;当没有包子时,消费线程进入等待状态,等待生产线程生产后通知。
- Producer和Consumer类分别实现了Runnable接口,并在run()方法中调用Baozi的生产和消费方法,实现了多线程的操作。
以上就是Java线程创建和线程同步的实现示例的完整攻略。通过学习示例,掌握了多线程编程的核心知识点。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java线程创建(卖票),线程同步(卖包子)的实现示例 - Python技术站