gpt4 book ai didi

java - 了解生成线程的类上的线程和同步

转载 作者:行者123 更新时间:2023-11-30 04:44:33 26 4
gpt4 key购买 nike

好的,有人可以向我解释一下我的知识差距吗?

最初,下面的示例尝试同步实例方法,但后来意识到我生成了一个新实例,因此不会发生锁定。

所以我决定对类的静态方法加锁,希望线程能够按顺序运行,但仍然没有成功。任何人都可以解释我的方法的错误吗? (请耐心等待,可能有更好的方法来做到这一点,这只是正确理解,我是一名进入 Java 的 PHP 开发人员,我喜欢它 - 但我只花了 2 天;-) )

所以此时数字以随机顺序打印出来。

1 级

package learningjava;


public class LearningJava {
/**
* @param args the command line arguments
*/
public static void main(String[] args) {

ThreadCaller ob1 = new ThreadCaller("This is a test string 1");
ThreadCaller ob2 = new ThreadCaller("This is a test string 2");
ThreadCaller ob3 = new ThreadCaller("This is a test string 3");
ThreadCaller ob4 = new ThreadCaller("This is a test string 4");
ThreadCaller ob5 = new ThreadCaller("This is a test string 5");

try {

ob1.t.join();
ob2.t.join();
ob3.t.join();
ob4.t.join();
ob5.t.join();

} catch (InterruptedException e) {

System.out.println(e);

}

}

}

2级

package learningjava;

public class ThreadCaller implements Runnable {

private String message;
public Thread t;

public ThreadCaller(String text) {
message = text;
t = new Thread(this);
t.start();
}

public static synchronized void echo(String message) {
System.out.println(message);
}


public void run() {
ThreadCaller.echo(this.message);
}

}

最佳答案

Can any explain the error of my ways?

基本上,您期望的订购根本无法保证。您连续在许多线程上调用 start()...无法保证哪个线程将首先开始执行。事实上,您拥有一个静态同步方法,仅意味着一次只有一个线程执行该方法 - 它不能保证有关顺序的任何信息。

假设您有一条跑道,跑道下方 100m 处有一个单车道大门。您开始比赛 - 哪位运行者将首先到达大门?

幸运的是,这通常不是问题 - 如果值得启动多个线程来做某事,您通常不关心它们的执行顺序。如果您这样做,那么是时候重新检查您的设计了。

关于java - 了解生成线程的类上的线程和同步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11373276/

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