>  Q&A  >  본문

java - new了2个Thread,为什么不是交叉打印?

public static void main(String[] args){

        new Thread(new Runnable() {
            @Override
            public void run() {
                for (int i=0; i<10; i++){
                    System.out.print(i+" ");
                }
            }
        }).start();

        new Thread(new Runnable() {
            @Override
            public void run() {
                for (int i=0; i<10; i++){
                    System.out.print(i+" ");
                }
            }
        }).start();
    }

输出结果如下:

0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 
PHPzPHPz2763일 전1473

모든 응답(13)나는 대답할 것이다

  • 阿神

    阿神2017-04-18 10:29:18

    CPU 실행속도도 너무 빠르고, 숫자도 너무 작아서 차이를 못느끼겠어요. 저라면 적어도 Integer.MaxValue.

    회신하다
    0
  • 伊谢尔伦

    伊谢尔伦2017-04-18 10:29:18

    동기화 잠금이 없으면 두 스레드는 언급한 교차 인쇄를 갖지 않습니다. 스레드 실행 우선순위는 누가 CPU 리소스를 먼저 획득하는지에 따라 달라집니다. 프로그램에서는 어떤 스레드가 먼저 실행되는지 보장할 수 없습니다. Java 멀티스레딩 지식에 대해 자세히 살펴보겠습니다.

    회신하다
    0
  • 迷茫

    迷茫2017-04-18 10:29:18

    설정 수가 너무 적습니다. 100개의 숫자를 설정하면 두 개의 스레드가 교차하는 인쇄 효과를 볼 수 있습니다. (여기서의 교차는 스레드 1이 숫자를 인쇄하고 스레드 2가 즉시 숫자를 인쇄하는 것이 아니라 분할하여 인쇄하는 것입니다. 세그먼트). ;CPU는 리소스를 확보하고 실행합니다. 교차 인쇄를 구현하려는 경우 생산과 소비자의 예입니다.

    회신하다
    0
  • 高洛峰

    高洛峰2017-04-18 10:29:18

    10개 숫자를 출력하기에는 너무 빠릅니다. 10을 100으로 변경해 보세요.

    회신하다
    0
  • 黄舟

    黄舟2017-04-18 10:29:18

    스레드 절전 시간 추가

    회신하다
    0
  • 伊谢尔伦

    伊谢尔伦2017-04-18 10:29:18

    0 0 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 내 것은 이렇다고 생각해 보세요

    회신하다
    0
  • PHP中文网

    PHP中文网2017-04-18 10:29:18

    두 for 루프의 출력 문 앞에 Thread.sleep(1000)을 추가하세요.
    다시 시도하세요

    회신하다
    0
  • 阿神

    阿神2017-04-18 10:29:18

    스레드는 실행 순서를 보장하지 않습니다.

    회신하다
    0
  • ringa_lee

    ringa_lee2017-04-18 10:29:18

    스레드의 실행 순서는 불확실합니다. CPU를 점유하는 사람이 실행하게 됩니다. 10개의 숫자 순서는 반드시 자신의 것이 아닙니다. 몇 번 실행하면 다른 결과가 나타납니다. 또한 스레드의 우선순위가 스레드의 실행 순서를 보장할 수는 없습니다. 단지 우선순위가 높은 스레드일수록 CPU 리소스를 얻을 확률이 더 높습니다.

    회신하다
    0
  • 迷茫

    迷茫2017-04-18 10:29:18

    으아악

    이렇게 하면 상대적으로 명백한 크로스 프린팅 현상을 볼 수 있지만, 실제로 동시성이란 어떤 스레드가 먼저 실행되고 어떤 스레드가
    나중에 실행되는지 알 수 없다는 의미이며, 반드시 그런 현상이 발생한다는 의미는 아닙니다. 크로스오버되세요. 과장해서 말하면 두 스레드 각각의 m, n 어셈블리 명령어를 삽입하면
    C_{m+n-1}^{min(m,n)}팩토리얼 수준의 실행 시퀀스를 가질 수 있습니다.

    회신하다
    0
  • 취소회신하다