关注
多线程编程的实战技巧主要包括线程操纵资源类、避免虚假唤醒、使用锁和条件变量等工具。以下是一个具体的例子:
1. 定义一个资源类Source,包含一个锁lock、三个条件变量conditionA、conditionB、conditionC和一个状态变量state。
```java
class Source {
Lock lock = new ReentrantLock();
Condition conditionA = lock.newCondition();
Condition conditionB = lock.newCondition();
Condition conditionC = lock.newCondition();
int state = 1;
void printA() {
System.out.println("A");
}
void printB() {
System.out.println("B");
}
void printC() {
System.out.println("C");
}
}
```
2. 定义三个线程类A、B、C,每个线程都包含一个Source对象,并实现run方法。在run方法中,线程首先获取锁,然后判断状态是否等于自己的序号,如果不是,则等待。如果是,则执行打印操作,并将状态设置为下一个线程的序号,最后通知下一个线程。
```java
class A implements Runnable {
private Source source;
public A(Source source) {
this.source = source;
}
@Override
public void run() {
source.lock.lock();
try {
while (source.state != 1) {
source.conditionA.await();
}
source.printA();
source.state = 2;
source.conditionB.signal();
} catch (Exception e) {
e.printStackTrace();
} finally {
source.lock.unlock();
}
}
}
```
3. 在主函数中,创建Source对象和三个线程,并启动线程。
```java
class Test {
public static void main(String[] args) throws InterruptedException {
Source source = new Source();
for (int i = 0; i < 100; i++) {
new Thread(new A(source)).start();
new Thread(new B(source)).start();
new Thread(new C(
查看原帖
点赞 评论
牛客热帖
更多
正在热议
更多
# 牛客新年AI问运 #
6798次浏览 111人参与
# 工作中的卑微时刻 #
33475次浏览 199人参与
# 牛客AI体验站 #
16356次浏览 288人参与
# 多益网络工作体验 #
63218次浏览 306人参与
# 有必要和同事成为好朋友吗? #
1109次浏览 21人参与
# 正在实习的碎碎念 #
1645284次浏览 13716人参与
# 面试中的破防瞬间 #
1190446次浏览 11027人参与
# 工作一周年分享 #
52387次浏览 274人参与
# 滴!实习打卡 #
786761次浏览 6841人参与
# 秋招吐槽大会 #
304450次浏览 1524人参与
# 机械人的薪资开到多少,才适合去? #
165108次浏览 571人参与
# 你最满意的offer薪资是哪家公司? #
71441次浏览 353人参与
# 大学最后一个寒假,我想…… #
89337次浏览 809人参与
# 你怎么看待AI面试 #
146106次浏览 786人参与
# 哪些公司真双非友好? #
62957次浏览 268人参与
# OC/开奖 #
411411次浏览 2282人参与
# 为了实习逃课值吗? #
65831次浏览 526人参与
# 如果可以选,你最想从事什么工作 #
722277次浏览 4870人参与
# 重来一次,你会对开始求职的自己说 #
32921次浏览 388人参与
# 如何提高实习转正率? #
86643次浏览 505人参与