java - 使用java中的两个线程多次打印 "Hello"和 "world"

标签 java multithreading

假设一个线程打印“Hello”,另一个线程打印“World”。我做过一次成功了,如下: 包线程;

public class InterThread {

    public static void main(String[] args) {
        MyThread mt=new MyThread();
        mt.start();
        synchronized(mt){
            System.out.println("Hello");
            try {
                mt.wait();
                i++;
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }

    }

}

class MyThread extends Thread{

    public void run(){
        synchronized(this){
        System.out.println("World!");
        notify();
        }
    }
}

如何进行多次打印,比如 5 次?我尝试在同步块(synchronized block)周围放置 for 循环,但没有用。

最佳答案

这里是两个相互依赖的线程,我们需要两个同步对象。它们可能是许多事情之一。一个整数,另一个对象;一个 boolean 值另一个对象;两者都反对;两个信号量等等。同步技术可以是 Monitor 或 Semaphore 任何你喜欢的方式,但它们必须是两个。

我已修改您的代码以使用信号量而不是监视器。信号量的工作更加透明。您可以看到获取和释放的发生。监视器是更高的构造。因此,Synchronized 在后台工作。

如果您对以下代码感到满意,则可以将其转换为使用监视器。

    import java.util.concurrent.Semaphore;

    public class MainClass {

        static Semaphore hello = new Semaphore(1);
        static Semaphore world = new Semaphore(0);

        public static void main(String[] args) throws InterruptedException {
            MyThread mt=new MyThread();     
            mt.hello = hello;
            mt.world = world;
            mt.start();

            for (int i=0; i<5; i++) {
                hello.acquire(); //wait for it
                System.out.println("Hello");

                world.release(); //go say world
            }
        }
    }

    class MyThread extends Thread{

        Semaphore hello, world;

        public void run(){
            try {
                for(int i = 0; i<5; i++) {
                    world.acquire(); // wait-for it
                    System.out.println("  World!");

                    hello.release(); // go say hello
                }

            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

关于java - 使用java中的两个线程多次打印 "Hello"和 "world",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16963405/

相关文章:

java - Eclipse 渲染问题

java - 为什么我在 IntelliJ logcat View 中看不到任何错误?

vb.net - 需要有关 VB.Net 多线程选项的建议

java - Thread.join 和 Synchronized 之间有什么区别?

java - 签名 View 不适用于 Android 8 + 设备

java - 重新分配字符串变量

java - Erlang 比单线程 Java 快之前需要多少个 CPU

java - JNI : AttachCurrentThread returns -1

java - 创建一个 HashSet 类型的 Java Bean 并在编辑器中收到错误

android - 如何管理 Looper 和线程(线程不会再死了!)