美文网首页J2ee
3个线程按顺序执行

3个线程按顺序执行

作者: 超人TIGA | 来源:发表于2022-03-24 10:42 被阅读0次
public class MyService
{
    private int flag = 1;
    
    public synchronized void printA(){
        
        while (flag != 1)
        {
            try
            {
                this.wait();
            }
            catch (InterruptedException e)
            {
                e.printStackTrace();
            }
        }
        System.out.print(Thread.currentThread().getName());
        flag = 2;
        this.notifyAll();
    }
    public synchronized void printB(){
        while (flag != 2)
        {
            try
            {
                this.wait();
            }
            catch (InterruptedException e)
            {
                e.printStackTrace();
            }
        }
        System.out.print(Thread.currentThread().getName());
        flag = 3;
        this.notifyAll();
    }
    public synchronized void printC(){
        while (flag != 3)
        {
            try
            {
                this.wait();
            }
            catch (InterruptedException e)
            {
                e.printStackTrace();
            }
        }
        System.out.print(Thread.currentThread().getName());
        flag = 1;
        this.notifyAll();
    }
}

测试代码:

package testABC;

public class TestMain
{
    public static void main(String[] args)
    {
//编写一个程序,启动三个线程,三个线程的ID分别是A,B,C;,每个线程将自己的ID值在屏幕上打印5遍,打印顺序是ABCABC...
//        MyService service = new MyService();
        MyService2 service = new MyService2();
        
        Thread A = new Thread(new Runnable()
        {
            @Override
            public void run()
            {
                for (int i = 0; i < 5; i++)
                {
                    service.printA();
                }
            }
        });
        A.setName("A");
        Thread B = new Thread(new Runnable()
        {
            @Override
            public void run()
            {
                for (int i = 0; i < 5; i++)
                {
                    service.printB();
                }
            }
        });
        B.setName("B");
        Thread C = new Thread(new Runnable()
        {
            @Override
            public void run()
            {
                for (int i = 0; i < 5; i++)
                {
                    service.printC();
                }
            }
        });
        C.setName("C");
        
        A.start();
        B.start();
        C.start();
    }
}

使用Lock实现:

import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

public class MyService2
{
    private int flag = 1;
    private Lock lock = new ReentrantLock();
    private Condition conditionA = lock.newCondition();
    private Condition conditionB = lock.newCondition();
    private Condition conditionC = lock.newCondition();

    public void printA()
    {
        try
        {
            lock.lock();
            if (flag != 1)
            {
                try
                {
                    conditionA.await();
                }
                catch (InterruptedException e)
                {
                    e.printStackTrace();
                }
            }
            System.out.print(Thread.currentThread().getName());
            flag = 2;
            conditionB.signal();
        }
        finally
        {
            lock.unlock();
        }

    }

    public void printB()
    {
        try
        {
            lock.lock();
            if (flag != 2)
            {
                try
                {
                    conditionB.await();
                }
                catch (InterruptedException e)
                {
                    e.printStackTrace();
                }
            }
            System.out.print(Thread.currentThread().getName());
            flag = 3;
            conditionC.signal();
        }
        finally
        {
            lock.unlock();
        }

    }

    public void printC()
    {
        try
        {
            lock.lock();
            if (flag != 3)
            {
                try
                {
                    conditionC.await();
                }
                catch (InterruptedException e)
                {
                    e.printStackTrace();
                }
            }
            System.out.print(Thread.currentThread().getName());
            flag = 1;
            conditionA.signal();
        }
        finally
        {
            lock.unlock();
        }
    }
}

相关文章

  • 【基础】练习册51-Python3_单线程:按顺序执行任务

    单线程:按顺序执行任务 代码如下: #coding=utf-8#单线程:按顺序执行任务from time impo...

  • iOS 多线程-CGD

    串行队列同步执行,不开启新线程,任务按顺序执行 串行队列异步执行,会开启新线程(1个),任务按照顺序执行 并行队列...

  • 线程按指定顺序执行

    在多线程中线程的执行是CPU随机调度的,无法指定线程的执行顺序,比如我们要让多线程按顺序执行输出 这段代码的输出顺...

  • 图解 Java 线程安全

    什么是线程 按操作系统中的描述,线程是 CPU 调度的最小单元,直观来说线程就是代码按顺序执行下来,执行完毕就结束...

  • 7张图带你轻松理解Java 线程安全

    / 什么是线程 / 按操作系统中的描述,线程是 CPU 调度的最小单元,直观来说线程就是代码按顺序执行下来...

  • Android线程池使用

    一:无大小限制的线程池执行效果如下 二:限制按顺序来执行任务的线程池效果如下 四:按指定个数来执行任务的线程池效果...

  • 3个线程按顺序执行

    测试代码: 使用Lock实现:

  • iOS 按顺序异步执行线程

    GCD方式,关键是信号量的三个重要用法:创建信号量为0dispatch_semaphore_t sema = di...

  • Swift GCD 的串行队列与并行队列

    队列异步是否阻塞当前线程同步是否阻塞当前线程执行顺序串行队列否是按添加顺序并行队列否是同时执行,但会被同步阻塞 串...

  • iOS重识

    1synchronized(互斥锁) 互斥锁,就是使用了线程同步技术,多条线程按顺序地执行任务 使用场景:多条线程...

网友评论

    本文标题:3个线程按顺序执行

    本文链接:https://www.haomeiwen.com/subject/gkkydrtx.html