Java线程错误
对于给定的程序,您能否解释一下,因为我没有得到我期望的结果:Java线程错误,java,multithreading,Java,Multithreading,对于给定的程序,您能否解释一下,因为我没有得到我期望的结果: package javaapplication14; class Mythread implements Runnable{ String myname; int myage; public Mythread( String par_name, int par_age){ myname = par_name; myage = par_age; } public
package javaapplication14;
class Mythread implements Runnable{
String myname;
int myage;
public Mythread( String par_name, int par_age){
myname = par_name;
myage = par_age;
}
public void run(){
try{
for(int i=1; i<=myage; i++) {
System.out.println("Happy birthday "+myname);
Thread.sleep(2000);
}
}catch(Exception e){
System.out.println();
}
}
}
public class JavaApplication14 {
public static void main(String[] args) {
Mythread m = new Mythread("Mutinda ", 2);
Mythread p = new Mythread("Boniface", 2);
Thread k = new Thread(m);
Thread q = new Thread(p);
k.start();
q.start();
Thread t = new Thread(m);
try{
for( int i=1; i<=5; i++){
System.out.println("Main thread executing");
Thread.sleep(1000);
}
}catch(Exception e){
System.out.println("Thread interrupted");
}
}
}
我预料到:
Main thread executing
Happy birthday Mutinda
Happy birthday Boniface
Main thread executing
Main thread executing
Happy birthday Mutinda
Happy birthday Boniface
Main thread executing
Main thread executing
我需要有人向我解释为两个线程k
和q
设置的优先级,以便q
的输出成为k
的第一个输出,而不考虑睡眠时间
我的参数:因为
k.start()
是在q.start()
之前调用的,所以我希望我的输出以k
开头,因为我先调用了它,两者占用相同的睡眠时间。基本上你的参数是错误的。start()函数不启动踏板。它只是将其置于可运行状态 基本上你的论点是错误的。start()函数不启动踏板。它只是将其置于可运行状态 当您启动线程时,这是因为您有独立的任务,这些任务很少或没有相互依赖性。因此,您不应该期望两个线程之间有特定的执行顺序,事实上,大多数多线程错误都来自于这样的假设
如果您希望事情按特定顺序发生,请使用单个线程。如果您可以假定任务没有特定的顺序,那么只能使用多个线程。当您启动线程时,这是因为您有独立的任务,这些任务几乎没有或没有相互依赖性。因此,您不应该期望两个线程之间有特定的执行顺序,事实上,大多数多线程错误都来自于这样的假设
如果您希望事情按特定顺序发生,请使用单个线程。如果可以假定任务没有特定的顺序,则只能使用多线程。多线程序列的执行不能依赖优先级。
Java线程的基本规则是,它将依赖于JVM,并且不能保证每个线程的执行顺序。优先级可以影响但不能确保执行多线程序列的执行不能依赖优先级。
Java线程的基本规则是,它将依赖于JVM,并且不能保证每个线程的执行顺序。优先级可以影响但不能确保执行我的代码似乎符合我的假设::我的问题是为什么k.start()----在第一位以外的第二位打印我的结果,并且由于它在q.start()之前进入运行开始,线程有一个状态概念。调用start()时,它建议JVM将其置于可运行状态(而不是开始执行)。在一个时间点上,可能有许多线程处于可运行状态。JVM随机选取并启动该线程。@user709577 k.start()不会启动线程执行……它只会说线程已准备好执行。JVM可以在任何时候选择它来运行它我的代码似乎符合我的假设::我的问题是为什么k.start()------在第一个位置以外的第二个位置打印我的结果,并且由于它在q.start()之前进入运行开始,线程有一个状态概念。调用start()时,它建议JVM将其置于可运行状态(而不是开始执行)。在一个时间点上,可能有许多线程处于可运行状态。JVM随机选取并启动该线程。@user709577 k.start()不会启动线程执行……它只会说线程已准备好执行。JVM可以在任何时候选择它来运行它,如果我将第二个线程优先级设置为10呢??第一个线程q到7???会发生什么情况???@user709577它可能会打印正确的结果,但不能保证在多个运行时会发生相同的情况,如果我将第二个线程优先级设置为10??第一个线程q到7???会发生什么情况???@user709577它可能会打印正确的结果,但不能保证在多次运行时会出现相同的结果
Main thread executing
Happy birthday Mutinda
Happy birthday Boniface
Main thread executing
Main thread executing
Happy birthday Mutinda
Happy birthday Boniface
Main thread executing
Main thread executing