java中的错误线程处理

java中的错误线程处理,java,concurrency,multithreading,Java,Concurrency,Multithreading,这段代码我已经运行了30次了 为什么控制台上的“总是第二,但为什么?”总是第二?调用t.start()时,我们有两个线程。(2层):主线程和第二线程。因此,“我正在运行”有时必须是控制台上的第二个输出。当我删除“always first”输出语句时,比剩下的两个输出都要少,表现为不确定性(这是应该的方式) 那么,我的想法有什么错,为什么System.out.println(“始终优先”);影响并发性 通过首先向控制台写入一些内容,很可能会影响JIT编译的发生,甚至可能影响类型初始化的发生。我不觉

这段代码我已经运行了30次了

为什么控制台上的“总是第二,但为什么?”总是第二?调用t.start()时,我们有两个线程。(2层):主线程和第二线程。因此,“我正在运行”有时必须是控制台上的第二个输出。当我删除“always first”输出语句时,比剩下的两个输出都要少,表现为不确定性(这是应该的方式)


那么,我的想法有什么错,为什么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?" );
}