多线程练习题

本文通过两个线程实例,详细介绍了如何实现线程间的同步,确保线程A执行完毕后线程B才开始,以及两个线程轮流打印数字到100。关键点在于使用join()方法来控制线程的执行顺序。
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();
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值