首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >以同步方式运行线程

以同步方式运行线程
EN

Stack Overflow用户
提问于 2012-11-17 14:42:44
回答 4查看 150关注 0票数 0

我需要并行运行两个线程。

1) PrimeThread,它计算从1到100的质数。2) evenThread,它计算从1到100的偶数。

我已经实现了质数和偶数逻辑。不要把注意力放在上面。我的问题是,

我想用下面的方式打印数字。10个素数,10个偶数,10个素数,10个偶数,其余的。

这有可能吗?

我使用了sleep()方法,但它不起作用。请帮帮我。谢谢。

EN

回答 4

Stack Overflow用户

发布于 2012-11-17 18:23:58

我需要并行运行两个线程。

..。

我想用下面的方式打印数字。10个素数,10个偶数,10个素数,10个偶数,其余的。

这似乎是矛盾的:您想要的输出意味着您真正想要的是以交错的方式按顺序运行任务。为什么不创建两个方法:printNextPrimes(int number)printNextEvens(int number),并在单线程循环中调用它们:

代码语言:javascript
复制
for (int i = 0; i < 10; i++) {
    printNextPrimes(10);
    printNextEvens(10);
}
票数 1
EN

Stack Overflow用户

发布于 2012-11-17 15:03:30

听起来你在找一个Semaphore

每个线程都有自己的信号量。在输出10个数字后,它将释放另一个线程拥有的信号量,并获取它自己的信号量。这将使另一个线程再次启动,并阻止该线程,直到它再次被释放。

票数 0
EN

Stack Overflow用户

发布于 2012-11-17 16:10:07

如下所示:

代码语言:javascript
复制
public class Test {
    static Object lock = new Object();
    static boolean printPrime = true;
    static boolean printEven;

    static class PrimeTread extends Thread {
        public void run() {
            int n = 0;
            while (n < 100) {
                synchronized (lock) {
                    if (printPrime) {
                        for (int i = 0; i < 10; i++) {
                            System.out.println(nextPrime());
                            n++;
                        }
                        printPrime = false;
                        printEven = true;
                        lock.notifyAll();
                    } else {
                        try {
                            lock.wait();
                        } catch (InterruptedException e) {
                            throw new RuntimeException(e);
                        }
                    }
                }
            }
        }

        private int nextPrime() {
            return 31;
        }
    }

    static class EvenTread extends Thread {
        public void run() {
            int n = 0;
            while (n < 100) {
                synchronized (lock) {
                    if (printEven) {
                        for (int i = 0; i < 10; i++) {
                            System.out.println(nextEven());
                            n++;
                        }
                        printPrime = true;
                        printEven = false;
                        lock.notifyAll();
                    } else {
                        try {
                            lock.wait();
                        } catch (InterruptedException e) {
                            throw new RuntimeException(e);
                        }
                    }
                }
            }
        }

        private int nextEven() {
            return 2;
        }
    }

    public static void main(String[] args) {
        new EvenTread().start();
        new PrimeTread().start();
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13428390

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档