当前位置: 首页 > 知识库问答 >
问题:

从3个线程按顺序打印3个不同的数字范围

顾乐池
2023-03-14

采访中问

有三条线。第一条线打印100到199个数字。第二个线程打印200到299之间的数字。第三条线从300到399。执行的顺序是

Thread100to199:100
Thread200to299:200
Thread300to399:300
Thread100to199:101
Thread200to299:201
Thread300to399:301
::::::::::::::::::
Thread300to399:398
Thread100to199:199
Thread200to299:299
Thread300to399:399

共有1个答案

谷奕
2023-03-14
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

/**
 * This class prints Range of numbers from 100-199, 200-299 and 300-399 from the
 * Thread100to199, Thread200to299 and Thread300to399 respectively.
 * The order of printing the Numbers/ order of running the threads is as follows
 * Thread100to199:100
 * Thread200to299:200
 * Thread300to399:300
 * Thread100to199:101
 * Thread200to299:201
 * Thread300to399:301
 * ::::::::::::::::::
 * Thread300to399:398
 * Thread100to199:199
 * Thread200to299:299
 * Thread300to399:399
 *
 */
public class RangeOrderedThread {

    static Lock lock = new ReentrantLock();
    static Condition cond = lock.newCondition();
    static int nextThreadRunCode ;

    public static void main(String[] args) {

        Thread t1 = new ThreadPrintRange(100,199);
        t1.setName("Thread100to199");
        Thread t2 = new ThreadPrintRange(200,299);
        t2.setName("Thread200to299");
        Thread t3 = new ThreadPrintRange(300,399);
        t3.setName("Thread300to399");
        nextThreadRunCode=100;
        t2.start();
        t1.start();
        t3.start();
    }
    private static class ThreadPrintRange extends Thread {

        int startRange,endRange;
        public ThreadPrintRange(int startRange, int endRange)
        {
            this.startRange = startRange;
            this.endRange = endRange;
        }

        @Override
        public void run() {

            while (true) {
                try {
                    if (!lock.tryLock()) {
                        lock.lock();

                        for (int i = startRange; i <= endRange; i++) {

                            while (! (nextThreadRunCode == startRange)) {
                                try {
                                    cond.await();
                                } catch (InterruptedException e) {
                                    e.printStackTrace();
                                }
                            }

                            System.out.println(Thread.currentThread().getName() + ":" + i);
                            nextThreadRunCode = getNextThreadRunCode(startRange);
                            cond.signalAll();
                        }
                    }
                } finally {
                    lock.unlock();
                }
            }
        }

        private int getNextThreadRunCode(int startRange) {

            if (startRange == 100)
            {
                return 200;
            }
            else if (startRange == 200) {
                return 300;
            }
            else return 100;
        }
    }
}

 类似资料:
  • 这个问题是在电子艺术采访中提出的。 有三条线。第一个线程打印1到10个数字。第二个线程打印从11到20的数字。第三条线从21到30。现在这三个线程都在运行。然而,数字是按不规则的顺序打印的,如1、11、2、21、12等。 如果我想让数字按排序顺序打印,比如1,2。。。我该怎么处理这些线呢?

  • 我试图创建一个实现,其中多个线程打印序列的备用值。这里thread1将打印1,4,7 thread2将打印2,5,8 thread3将打印3,6,9。我用的是原子整数和模函数。 下面的实现可以很好地工作,第一个线程打印1,4,7,第二个线程打印2,5,8,第三个线程打印3,6,9,但问题是没有保持顺序,即输出可能类似于1,3,2,4,5,7,8,6,9,而我希望保持顺序,因为正确的线程可以打印这些

  • 我正在回答以下面试问题: 一个进程有三个线程。第一个线程打印1 1 1...,第二个打印2 2 2...,第三个打印3 3 3...无休止。你如何安排这三个线程以打印1 2 3 1 2 3... 我想出了下面的代码,使用两个线程打印,但我无法找出如何从第三个线程在这里打印数字的条件。 如何有效地解决这类问题?

  • 问题内容: 我有3个线程第一打印A第二打印B第三打印C 我想按顺序打印ABCABCABC,依此类推..... 因此,我在下面编写了程序,但无法实现相同的目的。我知道一个问题,当时状态为1时,例如B1和C1线程正在等待,而当我做notifyAll()时,两个等待线程都被唤醒,并且取决于CPU分配,它可能会打印B或C。 在这种情况下,我只希望在A之后打印B。 我需要做什么修改。 问题答案: 将那些IF

  • 有两个线程,一个是打印偶数,另一个是打印奇数。在下面自定义锁的帮助下,我想按顺序打印数字。问题出在打印一些数字后(显示的数字顺序正确。)线程越来越死机。我花了一个多小时还是找不到问题,对我来说一切都很好。

  • 我最近开始在Java中使用多线程 我有一个问题,解决了一个问题,我只有5个线程,范围从T1、T2、... T5。 任务是按以下顺序打印从1到10的数字。 我试着用这段代码解决它。 但是由于只允许5个线程,我的解决方案没有被接受,因为我也在< code>for循环的< code>else块中实例化了< code>new Thread。 任何帮助将不胜感激。