发布网友 发布时间:2022-04-23 06:11
共7个回答
热心网友 时间:2022-04-15 09:41
》》。。。而sleep之后就会随机排序了,优先级此时就不起作用了,有没有解决的办法?
其中一个办法是让每一个线程记得必须比它先完成的另一个线程,
然后在必要时强制它放弃执行一直到那另一个线程执行完为止。 比如:
class CustomThread extends Thread {
private Thread 先完;
CustomThread(String name, Thread 先完) {
super(name);
this.先完 = 先完;
}
public void run() {
System.out.println(this.getName());
try {
sleep(2000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
if (先完 != null)
try {
先完.join();
} catch (InterruptedException e) {}
System.out.println("NAME: " + this.getName() + " Bye");
}
}
class MultiThread {
public static void main(String args[]) throws InterruptedException {
CustomThread thread1 = new CustomThread("first", null);
CustomThread thread2 = new CustomThread("second", thread1);
CustomThread thread3 = new CustomThread("third", thread2);
CustomThread thread4 = new CustomThread("fourth", thread3);
thread1.setPriority(Thread.MAX_PRIORITY);
thread2.setPriority(Thread.MAX_PRIORITY-1);
thread3.setPriority(Thread.MAX_PRIORITY-2);
thread4.setPriority(Thread.MAX_PRIORITY-3);
thread1.start();
thread2.start();
thread3.start();
thread4.start();
}
}
4 等 3、3 等 2、。。。 串联成单一线程了,所以如果情况允许的话,
把所有必须顺序执行的任务集合在单一线程里(比如留在 main 里)是另一个办法。
》》。。。优先级到底有什么用处?
轻易地让程序即使在非常忙碌的时候也能迅速处理使用者的输入(该输入也许是调整某项操作的优先级:)、编写游戏时更方便地实现战场上级别较高的一方优先攻击、等等。
热心网友 时间:2022-04-15 10:59
线程定义比较抽象,简单的说就是一个代码执行流。许多执行流可以混合在一起由CPU调度。线程是允许各种任务交互执行的方式。
Java的线程在操作系统的实现模式依系统不同而不同,可能是系统级别的进程或线程,但对于程序员来说并没有影响。
任务交互的一个好处是增加程序响应。如一个界面程序执行一段耗时的数据库查询,使用单独的线程可以让界面依然响应用户的其他输入,而单线程只能等待查询结束再处理。
JVM以及操作系统会优先处理优先级别高的线程,但不代表这些线程一定会先完成。设定优先级只能建议系统更快的处理,而不能强制。
你补充的情况完全正确。另外,在运行时,并没有按照函数分界,而是按照机器码/汇编码分界。也就是说不保证任何一段代码是被完整而不打断的执行的(除非你已经使用同步手段)。正由于如此,各种线程同步的方法应运而生。
热心网友 时间:2022-04-15 12:33
优先级只是说在同等情况下会被优先执行,但是你要知道,多线程是不可控的,结果是不能预知的.
还有一点就是,和你的线程要完成的内容有关,打个比方说 一个低优先的线程要完成 1+1 另一个高优先级的 要完成 2^65532(随便举的例子,可能和事实不符) ,那么显然低优先级的会先完成。这和操作系统本身的调度机制也有关系。
所以说线程的优先级就是:听天命,尽人事 (我认为)
热心网友 时间:2022-04-15 14:25
Java提供了10个优先级,但它与多数操作系统都不能很好地映射。比如Windows 2000有7个优先级,并且不是固定的,而SUN公司的Solaris操作系统有2的31次方个优先级。即时不同版本的Windows都有可能支持不同数量的优先级,如果希望程序能移植到不同的平台中,应该确保在设置线程的优先级时,尽量只使用绝大多数操作系统都支持的MAX_PRIORITY;NORM_PRIORITY;MIN_PRIORITY这三个优先级。这样才能保证在不同的操作系统中,对同样优先级的线程式采用同样的调试方式。
在你写的程序中,你只是简单的减一,Windows可能不支持其中一个或两个,所以导致你的程序写的很明确,但是执行起来可能就不一定是这样了。
热心网友 时间:2022-04-15 16:33
首先你要搞清楚优先的《前提》是什么?是在同情况下才优。
在sleep之前,你的优先级是体现出来了作用的,但是sleep之后的线程是要根据CPU的随机调度决定运行顺序的,有人说听天命,我认为不可行的,因为让程序听天命的话,那就不是好程序,这样,解决办法是有的,就是不要用sleep方法,你可以用yield()来控制线程的暂停开关,用Exception机制来控制线程的周期(这个自己网上搜,我的回答从来不复制别人的东西)。
热心网友 时间:2022-04-15 18:57
用处是建议JVM优先调度,在一个长时期内(如连续运行一天,一周,一个月)时保持某线程占用较多的CPU.
控制顺序不是用priority来控制的。
aven88,抄我在别处的答案,注明转贴可不可以?
热心网友 时间:2022-04-15 21:39
Java线程的优先级越高,就越是先执行。A最低为1,B为6,C为10。程序在执行时先看线程的优先级,保证高优先级的先执行,同级别优先级的按顺序执行。并且线程在调用run方法后才开始执行。
上面的程序中,虽然创建顺序为ABC,但他们同时调入内存(因为java对于一个完整的程序是批处理),jvm会保证线程优先级顺序执行。