Java线程行为

Java线程行为,java,Java,我在互联网上看到了以下示例: public class TwoThreads { public static class Thread1 extends Thread { public void run() { System.out.println("A"); System.out.println("B"); } } public static class Thread2 extends Thread { public void run()

我在互联网上看到了以下示例:

public class TwoThreads {
public static class Thread1 extends Thread {
    public void run() {
        System.out.println("A");
        System.out.println("B");
    }
}
public static class Thread2 extends Thread {
    public void run() {
        System.out.println("1");
        System.out.println("2");
    }
}
public static void main(String[] args) {
    new Thread1().start();
    new Thread2().start();
}
}


我的问题是:

  • 可以保证“A”将在“B”之前打印,“1”将在“2”之前打印,但“1”是否可能由另一个线程连续打印两次?在这段代码中,我们至少有3个线程(1个主线程和2个创建线程)。我们能想象调度程序运行1个线程吗:newthread1().start();然后在System.out.println(“1”)之后立即放弃;然后再次在Thread1()中运行另一个威胁;又打印了“1”吗

  • 我使用的是NetBeans IDE,似乎运行这样一个程序总是会得到相同的第一个结果,所以缓存似乎有些问题。根据我的理解,你可以通过声明可变变量来处理这个问题,这可以在这里实现吗,如何实现?如果不是,那么缓存的解决方案是什么

  • 在今天的计算机处理器中,我们大多有两个处理器,但我们仍然发现网络上的许多多线程程序使用的线程超过了两个!对于编译来说,这个过程不是变得又重又慢吗

  • 1) 无法保证线程将以什么顺序进行

    2) 不过,顺序也不是随机的。因此,如果在相同(或非常相似)的条件下运行程序,可能会产生相同的线程交错。如果你需要有某种行为(包括随机行为),你需要自己同步

    3) 一个有两个内核的CPU只能同时运行两个线程,但大多数线程的大部分时间并不是实际使用CPU,而是等待I/O或用户交互之类的东西。因此,拥有两个以上的线程可以获得很多好处(只有两个线程可以并发计算,但数百个线程可以并发等待)。看看node.js,这是一种最近流行的多线程编程的替代方案,它可以在只有一个执行线程的情况下实现并发请求的高吞吐量。

    1)无法保证线程的执行顺序

    2) 不过,顺序也不是随机的。因此,如果在相同(或非常相似)的条件下运行程序,可能会产生相同的线程交错。如果你需要有某种行为(包括随机行为),你需要自己同步


    3) 一个有两个内核的CPU只能同时运行两个线程,但大多数线程的大部分时间并不是实际使用CPU,而是等待I/O或用户交互之类的东西。因此,拥有两个以上的线程可以获得很多好处(只有两个线程可以并发计算,但数百个线程可以并发等待)。看看node.js,这是一种最近流行的多线程编程的替代方案,它可以在只有一个执行线程的情况下实现并发请求的高吞吐量。

    回答您的1/2问题: 虽然线程运行并行代码,但线程的run方法始终是按顺序执行的


    回答你的3个问题,你可以最好地调整你的答案。应用程序如果处理器数量=线程数量,但这不是一个完整的事实,因为如果线程正在等待某个阻塞操作,则会导致性能未优化,因为在此期间,另一个线程可能会运行。

    回答您的1/2问题: 虽然线程运行并行代码,但线程的run方法始终是按顺序执行的

    回答你的3个问题,你可以最好地调整你的答案。应用程序如果处理器数量=线程数量,但这不是一个完全的事实,因为如果线程正在等待某个阻塞操作,那么它将导致未优化的性能,因为在此期间另一个线程可能会运行

  • 不。您没有以任何方式同步线程,因此确切的执行顺序将由调度程序决定。考虑到你的线程是如何实现的,我看不出你怎么会让一个线程打印两次“1”(或“A”)

  • 什么缓存?什么变量?您的示例代码没有变量,因此没有适合与
    volatile
    关键字一起使用的变量。在给定的机器上运行此程序很可能总是产生相同的结果。如#1中所述,您将受调度程序的支配。如果调度程序总是以相同的方式运行,您将始终得到相同的结果。缓存与此无关

  • 这取决于线程在做什么。如果每个线程都有足够的工作将一个CPU核心加载到100%,那么是的,拥有比CPU核心更多的线程是没有意义的。然而,这种情况很少发生。许多线程将花费大部分时间睡眠,或等待I/O完成,或做一些要求不足以完全加载CPU核心的事情。在这种情况下,拥有比CPU核心更多的线程没有任何问题。事实上,多线程早于主流的多核CPU,甚至在我们都没有多个CPU核的时候,能够有多个线程仍然非常有益

  • 不。您没有以任何方式同步线程,因此确切的执行顺序将由调度程序决定。考虑到你的线程是如何实现的,我看不出你怎么会让一个线程打印两次“1”(或“A”)

  • 什么缓存?什么变量?您的示例代码没有变量,因此没有适合与
    volatile
    关键字一起使用的变量。在给定的机器上运行此程序很可能总是产生相同的结果。如#1中所述,您将受调度程序的支配。如果调度程序总是以相同的方式运行,您将始终得到相同的结果。缓存与此无关

  • 这取决于线程在做什么。如果每个线程都有足够的工作将一个CPU内核加载到100%,那么