1.要求线程a执行完才开始线程b, 线程b执行完才开始主线程
思路:由题意可知会有两条副线程a和b,编写好a,b的内容后,在主线程中启动两个线程。
关键点在于,一旦开启线程,线程的执行完全是由各自抢占cpu的能力而定,是人为不可控的,为了实现题目中的要求,我们需要在b线程中添加a.join()语句,便可以实现即使由b抢占到了cpu使用权,依旧会等a执行完,同样的方法在main方法中添加b.join()来实现main最后运行。
package concurrent.thread;
/**
* <p>Desription: </p>
*
* @Author: 罗志远
* @Date: 2021/5/6 0:05
* @ProjectName: Thread
* @Package: concurrent.thread
* @ClassName: T1
* @Version: 1.0
*/
public class T1 {
public static void main(String[] args) {
final Thread a = new Thread("A线程"){
@Override
public void run() {
for (int i = 0; i < 10; i ++) {
System.out.println(getName() + ":" + i);
}
}
};
Thread b = new Thread("B线程") {
@Override
public void run() {
try {
a.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
for (int i = 0; i < 10; i ++) {
System.out.println(getName() + ":" + i);
}
}
};
a.start();
b.start();
try {
b.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
for (int i = 0; i < 10; i ++) {
System.out.println("main :" + i);
}
}
}
2.两个线程轮流打印数字,一直到100
package concurrent.thread;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
/**
* <p>Desription: </p>
* sleep会让出cpu,不会释放锁
* wait/await会释放锁
* @Author: 罗志远
* @Date: 2021/5/9 23:52
* @ProjectName: Thread
* @Package: concurrent.thread
* @ClassName: PrintNumber
* @Version: 1.0
*/
public class PrintNumber extends Thread {
private static int number = 0;
private static Lock lock = new ReentrantLock();
private static Condition condition = lock.newCondition();
private String name;
public PrintNumber(String name) {
this.name = name;
}
@Override
public void run() {
while (number < 100) {
lock.lock();
try {
System.out.println("线程" + name + ": " + number);
number ++;
condition.signal();
condition.await();
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
}
public static void main(String[] args) {
PrintNumber a = new PrintNumber("a");
PrintNumber b = new PrintNumber("b");
a.start();
b.start();
}
}
本文通过两个线程实例,详细介绍了如何实现线程间的同步,确保线程A执行完毕后线程B才开始,以及两个线程轮流打印数字到100。关键点在于使用join()方法来控制线程的执行顺序。
623

被折叠的 条评论
为什么被折叠?



