java中的错误线程处理
这段代码我已经运行了30次了 为什么控制台上的“总是第二,但为什么?”总是第二?调用t.start()时,我们有两个线程。(2层):主线程和第二线程。因此,“我正在运行”有时必须是控制台上的第二个输出。当我删除“always first”输出语句时,比剩下的两个输出都要少,表现为不确定性(这是应该的方式)java中的错误线程处理,java,concurrency,multithreading,Java,Concurrency,Multithreading,这段代码我已经运行了30次了 为什么控制台上的“总是第二,但为什么?”总是第二?调用t.start()时,我们有两个线程。(2层):主线程和第二线程。因此,“我正在运行”有时必须是控制台上的第二个输出。当我删除“always first”输出语句时,比剩下的两个输出都要少,表现为不确定性(这是应该的方式) 那么,我的想法有什么错,为什么System.out.println(“始终优先”);影响并发性 通过首先向控制台写入一些内容,很可能会影响JIT编译的发生,甚至可能影响类型初始化的发生。我不觉
那么,我的想法有什么错,为什么System.out.println(“始终优先”);影响并发性 通过首先向控制台写入一些内容,很可能会影响JIT编译的发生,甚至可能影响类型初始化的发生。我不觉得这完全令人难以置信,像这样的事情改变了观察到的顺序。看到程序在不同系统和不同JVM上的行为略有不同,我不会感到惊讶 问题是,这两种命令都是完全有效的。你不应该依赖于它是一个或另一个,如果它总是以同样的方式发生,那么它就不是一个bug。(或者更确切地说,它可能是——但不一定是。)
如果您想确保一个特定的顺序,您需要明确地这样做-如果您不介意事情发生的顺序,那么就没有问题:)通过先向控制台写入一些内容,您可能会影响JIT编译的发生,甚至可能会影响类型初始化的发生。我不觉得这完全令人难以置信,像这样的事情改变了观察到的顺序。看到程序在不同系统和不同JVM上的行为略有不同,我不会感到惊讶 问题是,这两种命令都是完全有效的。你不应该依赖于它是一个或另一个,如果它总是以同样的方式发生,那么它就不是一个bug。(或者更确切地说,它可能是——但不一定是。) 如果你想确保一个特定的顺序,你需要明确地做到这一点-如果你不介意事情发生的顺序,那么就没有问题:)
System.out.println(“总是第一”)
总是排在第一位,因为它在第二个线程开始之前出现,所以它永远不会影响并发性
尝试将“总是第一”句放在t.start()之后
,您可能会得到您期望的:)System.out.println(“始终第一”)
将始终排在第一位,因为它在第二个线程启动之前出现,所以它永远不会影响并发性
尝试将“总是第一”句放在t.start()之后代码>,您可能会得到您所期望的:)
这段代码我已经运行了30次了
在每个操作系统和硬件组合上再运行70亿次,然后报告您的发现。30是一个非常低的永久值
为什么控制台上的“总是第二,但为什么?”总是第二
你们有多少核?大多数线程调度程序将支持当前运行的线程而不是新生成的线程,尤其是在单核上,并且将支持在尽可能晚的时间点在核之间同步线程(线程对象和System.out需要在操作系统线程之间传递)
由于线程是不确定的,而且大多数操作系统都不能保证公平性和及时性,因此它的这种行为绝不是一个bug
如果您想要线程之间的显式排序,那么应该使用syncronized块或java.util.concurrent中更强大的类。如果需要非确定性行为,但要允许另一个线程运行,可以使用thread.yield()
向调度程序提供提示
这段代码我已经运行了30次了
在每个操作系统和硬件组合上再运行70亿次,然后报告您的发现。30是一个非常低的永久值
为什么控制台上的“总是第二,但为什么?”总是第二
你们有多少核?大多数线程调度程序将支持当前运行的线程而不是新生成的线程,尤其是在单核上,并且将支持在尽可能晚的时间点在核之间同步线程(线程对象和System.out需要在操作系统线程之间传递)
由于线程是不确定的,而且大多数操作系统都不能保证公平性和及时性,因此它的这种行为绝不是一个bug
如果您想要线程之间的显式排序,那么应该使用syncronized块或java.util.concurrent中更强大的类。如果需要非确定性行为,但要允许另一个线程运行,可以使用thread.yield()
向调度程序提供提示
为什么控制台上的“总是第二,但为什么?”总是第二
它并不总是第二个。我在大约5次代码执行中成功地生成了这两个订单。这两种排序都是有效的,线程调度取决于您的操作系统,也可能取决于JVM和硬件
那么,我的想法有什么错,为什么System.out.println(“始终优先”);影响并发性
你的想法是对的,你的实验误导了你;)
为什么控制台上的“总是第二,但为什么?”总是第二
它并不总是第二个。我在大约5次代码执行中成功地生成了这两个订单。这两种排序都是有效的,线程调度取决于您的操作系统,也可能取决于JVM和硬件
那么,我的想法有什么错,为什么System.out.println(“始终优先”);影响并发性
你的想法是对的,你的实验误导了你;)
public class Test extends Thread{
public void hello(String s){
System.out.println(s);
}
public void run(){
hello("I’mrunning...");
}//endofrun()
public static void main(String [] args){
Test t=new Test();
System.out.println("always first");
t.start();
System.out.println("always second but why?");
}
}
public static void main ( String [] args )
{
FirstThreadBug t = new FirstThreadBug();
System.out.println ( "always first" );
t.start();
yield();
System.out.println ( "always second but why?" );
}