使用两个线程交替打印1到10的两种实现方式

本文介绍了一种利用两个线程交替打印数字1到10的实现方法。通过使用synchronized关键字和wait/notify机制,确保了线程间的正确同步与交替执行。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

@感谢小毛豆

今天一个同学说在面试的时候,遇到了一个面试题,两个线程交替打印1到10,感觉还是很有意思的就发表一下

实现Runnable()接口

要实现交替打印意味着者两个线程要交替执行某一段相同代码,以相同的逻辑方式等待和唤醒其他的线程,首先写执行的逻辑代码

package method1;

/**
 * Create by Kenson on 2019/4/3
 */
public class MyTask {

    public synchronized void PrintNum(int i){
        this.notify();
        System.out.println(Thread.currentThread().getName()+":"+i);
        try {
            this.wait();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

}

使用匿名内部类的方法创建线程:因为在同一对象中,所以他们的琐是相同的.

package method1;

/**
 * Create by Kenson on 2019/4/3
 */

public class SwapPrint {
    static int r =0;
    public static void main(String[] args) {
        MyTask task = new MyTask();
        Thread thread1 = new Thread(new Runnable() {
            @Override
            public void run() {
                for (int i = 0; i < 5; i++) {
                    r++;
                    task.PrintNum(r);
                    if(r>=10){
                        System.exit(1);
                    }
                }
            }
        });
        thread1.setName("我是线程1");
        thread1.start();

        Thread thread2 = new Thread(new Runnable() {
            @Override
            public void run() {
                for (int i = 0; i < 5; i++) {
                    r++;
                    task.PrintNum(r);
                    if(r>=10){
                        System.exit(1);
                    }
                }
            }
        });
        thread2.setName("我是线程2");
        thread2.start();


    }
}

打印结果:
在这里插入图片描述

继承Thread类的实现方式:

和继承接口的方式一样,这里首先写一个公用的代码块:

package method1;

/**
 * Create by Kenson on 2019/4/3
 */

public class ThreadModel extends Thread {

    static int r = 1;

    @Override
    public void run() {
        synchronized (ThreadModel.class){

            for (int i = 0; i < 5; i++) {
                ThreadModel.class.notify();
                System.out.println(Thread.currentThread().getName()+":"+ r);
                r++;
                if (r>=10){
                    return;
                }
                try {
                    ThreadModel.class.wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

值得注意的是这里要加上同步锁来实现需求,每个对象都有一把琐,这里使用ThreadModel.class来当作琐
实现需求代码:

package method1;

/**
 * Create by Kenson on 2019/4/3
 */

public class ThreadTest {
    public static void main(String[] args) throws InterruptedException {
        ThreadModel testThread1 = new ThreadModel();
        testThread1.setName("我是线程1");
        testThread1.start();

        ThreadModel testThread2 = new ThreadModel();
        testThread2.setName("我是线程2");
        testThread2.start();
    }
}

打印结果:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

格斗小巨人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值