gpt4 book ai didi

java - 如何同步线程

转载 作者:行者123 更新时间:2023-12-01 16:35:24 25 4
gpt4 key购买 nike

在这个多线程程序中,当我运行它时,我总是以某种随机顺序获得输出。但我想知道是否有任何方法可以使该程序在同步模式下工作。就像当我运行它时,对于第一个线程,它应该打印出所有内容,然后对于第二个线程,它应该打印出一些内容,然后对于第三个线程,它应该打印出所有内容等等。因此,每个线程的示例输出应该像这样-

Task 1 Started
original: Hello World
Difference:- 0
Task 1 Ended

Task 2 Started
original: Hello World
Difference:- 0
Task 2 Ended

............
............


Task 15 Started
original: Hello World
Difference:- 0
Task 15 Ended

这是我的下面的程序。任何建议将不胜感激。

class ThreadTask implements Runnable {
private int id;

public ThreadTask(int id) {
this.id = id;
}

public synchronized void run() {

System.out.println("Task " + id + " Started ");

String originalString = "Hello World";

System.out.println("original: " + originalString);

System.out.println("Task " + id + " Ended ");

}
}

public class TestPool {

public static void main(String[] args) throws InterruptedException {
int size = 5; //Integer.parseInt(args[0]);

// create thread pool with given size
ExecutorService service = Executors.newFixedThreadPool(size);

// queue some tasks
for(int i = 1; i <= 3 * size; i++) {
service.submit(new ThreadTask(i));
}


// wait for termination
service.shutdown();
service.awaitTermination(Long.MAX_VALUE, TimeUnit.DAYS);
}
}

最佳答案

您对 Jakub 的回答的评论如下:

Can you give me example basis on my code as I just started learning about threading. It will be of great help to me.

Jakub 的意思是,强制线程按固定顺序运行就违背了使用线程的初衷。 想一想。

<小时/>

如果您确实想要/需要您的示例按顺序运行任务,您也可以这样做:

for (int i = 1; i <= 3 * size; i++) {
new ThreadTask(i).run();
}

即只需在当前线程中运行可运行对象即可。

或者您可以将最大池大小设置为 1,这会强制服务按顺序运行任务。 (当然,这违背了使用线程的意义。这样您就不会获得任何并行性。)

<小时/>

更明智的方法是让每个线程在 Future 中返回其结果,然后让主线程从每个 future 中获取值(按所需的顺序)并打印它。基本上,您希望允许线程以任何顺序运行(如果您有多个核心,则可以并行运行),然后在访问结果时强制执行顺序。

关于java - 如何同步线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9746598/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com