微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在 Java 中将每个线程的输出放在一行中

如何解决如何在 Java 中将每个线程的输出放在一行中

我正在学习多线程,但同时我对 Java 的经验不是很丰富。来自 here

的这个例子

输出是这个

thread1: Java
thread2: Java
thread1: is
thread2: is
thread1: hot,thread1: aromatic,thread2: hot,thread1: and
thread1: invigorating.
Thread 1 is dead.
thread2: aromatic,thread2: and

是否有可能有这样的输出

thread1:Java is hot,aromatic,and invigorating. is dead.
thread2:Java is hot,and

所以基本上,线程 1 的输出总是链接在终端的第一行,线程 2 的链接在第二行?

解决方法

您可以使用 StringBuilder 将字符串附加到您当时已有的字符串,并在处理结束时打印完整的字符串:

StringBuilder sb = new StringBuilder();
sb.append(text);

然后使用

System.out.println(sb.toString());

这将在处理结束时显示结果。

请注意,如果多个线程在您的应用程序中修改同一个 StringBuilder 实例,那么某些修改可能会丢失。在这种情况下,您应该改用 StringBuffer

,

是否有可能有这样的输出

thread1:Java 是炙手可热、芳香四溢、令人振奋的。死了。

thread2:Java 很火,很香,而且

是的,当然,您只需要确保每个线程一次打印整个字符串即可。

所以基本上线程1的输出总是链接在第一行 在终端和线程2在第2行?

有几种方法可以实现这一点,例如您可以使用 CyclicBarrier

允许一组线程全部等待的同步辅助 彼此到达共同的障碍点。 CyclicBarriers 很有用 在涉及固定大小线程的程序中,必须 偶尔互相等待。屏障被称为循环的,因为 等待线程释放后可以重复使用。

协调线程,以便输出一个在另一个之前发生。

这是一个完整的例子:

public class Mult {
 
    public static void main(String[] args) {

        final int total_threads = 2;
        final CyclicBarrier barrier = new CyclicBarrier(total_threads);
        String msg1 = "thread1:Java is hot,aromatic,and invigorating. is dead.";
        String msg2 = "thread2:Java is hot,and";
        Thread thread1 = new Thread(() -> parallel_task1(barrier,msg1));
        Thread thread2 = new Thread(() -> parallel_task2(barrier,msg2));
        thread1.start();
        thread2.start();
        thread1.join();
        thread2.join();
    }

    private static void parallel_task1(CyclicBarrier barrier,String msg1) {
        System.out.println(msg1);
        wait_for_barrier(barrier);
    }

    private static void parallel_task2(CyclicBarrier barrier,String msg1) {
        wait_for_barrier(barrier);
        System.out.println(msg1);
    }

    private static void wait_for_barrier(CyclicBarrier barrier) {
        try {
            barrier.await();
        } catch (InterruptedException | BrokenBarrierException e) {
            e.printStackTrace();
        }
    }
}

另一种方法是用户 Future

这种方法的一个例子:

public class Mult {

    public static void main(String[] args) throws InterruptedException,ExecutionException {

        final int total_threads = 2;
        ExecutorService executor = Executors.newFixedThreadPool(total_threads);
        Future<String> future1 = executor.submit(Mult::parallel_task1);
        Future<String> future2 = executor.submit(Mult::parallel_task2);
        String thread1_msg = future1.get();
        String thread2_msg = future2.get();
        System.out.println(thread1_msg);
        System.out.println(thread2_msg);
        executor.shutdown();
        executor.awaitTermination(1,TimeUnit.SECONDS);
    }

    private static String parallel_task1() {
        return "thread1:Java is hot,and invigorating. is dead.";
    }

    private static String parallel_task2() {
        return "thread2:Java is hot,and";
    }
}

我正在学习多线程,但同时我不是很 有Java经验。从这里的例子

IMO,您不应该在尝试协调线程时浪费太多时间,以便它们能很好地打印输出。并行性更多地是关于 IMO、加速应用程序等,而不是协调输出。直接输出或仅使用一个线程负责输出要容易得多。此类教程使用输出作为示例,因为它对用户更友好,但根据我的经验,我从未需要协调来自 System.out 的输出。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?