繁体   English   中英

Java线程行为

[英]Java Threading behavior

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

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();
}

}


我的问题是:

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

  2. 我正在使用NetBeans IDE,似乎运行这样的程序总是会导致相同的第一个结果,因此似乎存在缓存。 根据我的理解,您通过声明volatile变量来解决这个问题,请问如何在这里完成? 如果不是,那么缓存的解决方案是什么?

  3. 在当今计算机的处理器中,我们大多数情况下有2个处理器,但仍然发现网络上有许多使用2个以上线程的多线程程序! 编译的过程难道不是很繁琐吗?

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

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

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

回答您的1/2问题:尽管线程在线程的run方法内部运行并行代码,但始终按顺序执行。

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

  1. 不。您没有以任何方式同步线程,因此确切的执行顺序将由调度程序控制。 鉴于线程的实现方式,我看不到如何通过单个线程将“ 1”(或“ A”)打印两次。

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

  3. 这取决于线程在做什么。 如果每个线程都有足够的工作量来将一个CPU内核加载到100%,那么是的,拥有比CPU内核更多的线程是没有意义的。 但是,这种情况很少发生。 许多线程将把大部分时间都花在睡觉,等待I / O完成或以其他方式完成不足以完全加载CPU内核的事情上。 在这种情况下,拥有更多的CPU核心线程是没有问题的。 实际上,多线程早于主流多核CPU,甚至在我们每个人都没有一个以上CPU内核的时代,拥有多个线程仍然非常有益。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM