有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

运行通过扩展Thread类创建的3个线程的程序的java输出

我是Java多线程的新手,正在尝试找出下面创建3个线程a、b和c的代码的输出


class A extends Thread {
    int i = 0;

    public void run() {
        System.out.println("Thread A started");
        while (i < 4) {
            System.out.println("\t value of i in Thread A:" + i);
            i++;
        }
        System.out.println("ThreadA finished");
    }
}

class B extends Thread {
    public void run() {
        int i = 0;
        System.out.println("ThreadB started");
        while (i < 4) {
            System.out.println("\t value of i in Thread B:" + i);
            i++;
        }
        System.out.println("ThreadB finished");
    }
}

class C extends Thread {
    public void run() {
        int i = 0;
        System.out.println("ThreadC started");
        while (i < 4) {
            System.out.println("\t value of i in Thread C" + i);
            i++;
        }
        System.out.println("ThreadC finished");
    }
}

public class App {
    public static void main(String[] args) throws Exception {
        // System.out.println("Hello, World!");

        System.out.println("Main Thread started");
        A a = new A();
        B b = new B();
        C c = new C();
        Thread th = Thread.currentThread();
        System.out.println(th.getName());
        System.out.println(th.getPriority());
        System.out.println("Priority of A thread " + a.getPriority());
        System.out.println("Priority of B thread " + b.getPriority());
        System.out.println("Priority of C thread " + c.getPriority());
        System.out.println();
        th.setPriority(Thread.MAX_PRIORITY);
        b.setPriority(Thread.MIN_PRIORITY);
        c.setPriority(Thread.NORM_PRIORITY);
        System.out.println("Showing new Priorites \n");
        System.out.println("Priority of TH thread " + th.getPriority());
        System.out.println("Priority of A thread " + a.getPriority());
        System.out.println("Priority of B thread " + b.getPriority());
        System.out.println("Priority of C thread " + c.getPriority());
        System.out.println();
        a.start();
        b.start();
        c.start();
    }
}

以上代码的输出是

Main Thread started
main
5
Priority of A thread 5
Priority of B thread 5
Priority of C thread 5

Showing new Priorites

Priority of TH thread 10
Priority of A thread 5
Priority of B thread 1
Priority of C thread 5

ThreadC started
         value of i in Thread C0
Thread A started
         value of i in Thread A:0
         value of i in Thread A:1
         value of i in Thread C1
         value of i in Thread C2
         value of i in Thread C3
ThreadC finished
ThreadB started
         value of i in Thread A:2
         value of i in Thread A:3
ThreadA finished
         value of i in Thread B:0
         value of i in Thread B:1
         value of i in Thread B:2
         value of i in Thread B:3
ThreadB finished

我知道在调用start()方法之后,线程就可以运行了,并且可以由线程调度程序选择

从输出中我们可以看到线程C首先开始运行其run()方法,然后它应该完成其run()方法。但在线程C的run()方法完成之前,线程a的run()方法是如何执行的呢? 谁来帮帮忙


共 (1) 个答案

  1. # 1 楼答案

    您不应该依赖线程优先级。这就是Oracle JRockit documentation所说的:

    Don't Depend on Thread Priorities

    Be careful when using java.lang.Thread.setPriority. Depending on thread priorities might lead on unwanted or unexpected results since the scheduling algorithm might choose to starve lower priority threads of CPU time and never execute them. Furthermore the result might differ between operating systems and JVMs.

    The Java API specification states that "Every thread has a priority. Threads with higher priority are executed in preference to threads with lower priority."

    The priority set by the setPriority() method is a parameter that might be used in the thread-scheduling algorithm, which shares CPU execution time between executing threads. This algorithm might be controlled either by the JVM or by the operating system. It is important to be aware of the fact that this algorithm normally differs between operating systems and that the algorithm might change between releases of both the operating system and the JVM. For BEA JRockit JVM native threads, the algorithm is implemented by the operating system.

    您所观察到的是线程调度的系统特定行为的影响。。。如上述文档所述(例如)