关注
多线程编程的实战技巧主要包括线程操纵资源类、避免虚假唤醒、使用锁和条件变量等工具。以下是一个具体的例子:
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(
查看原帖
点赞 评论
牛客热帖
更多
正在热议
更多
# 26届春招投递记录 #
30260次浏览 220人参与
# 妈妈治愈了你哪些脆皮时刻 #
47069次浏览 352人参与
# 27届实习投递记录 #
110082次浏览 1085人参与
# 我的工作日记 #
207379次浏览 1821人参与
# 我的求职总结 #
509637次浏览 7058人参与
# 大学生该如何认清当下的就业环境? #
178277次浏览 939人参与
# 要毕业了,再不说就来不及了 #
4768次浏览 88人参与
# AI面会问哪些问题? #
132875次浏览 3315人参与
# 25届非技术实习投递记录 #
159204次浏览 1027人参与
# 我与AI的日常 #
10131次浏览 152人参与
# 如果公司降薪,你会跳槽吗? #
168551次浏览 968人参与
# 你的秋招进行到哪一步了 #
2801745次浏览 23414人参与
# 你觉得什么岗位会被AI替代 #
65184次浏览 386人参与
# 腾讯工作体验 #
645914次浏览 3911人参与
# 怎么给家人解释你的工作? #
60377次浏览 224人参与
# 摸鱼被leader发现了怎么办 #
207065次浏览 937人参与
# 滴!实习打卡 #
860725次浏览 6901人参与
# 牛友的志愿填报指南 #
72206次浏览 503人参与
# 材料专业就业可以去哪些企业岗位 #
69088次浏览 396人参与
# 你遇到过哪些神仙同事 #
147267次浏览 778人参与

查看10道真题和解析