当前位置:首页 » 操作系统 » java线程调度算法

java线程调度算法

发布时间: 2022-09-01 22:17:45

‘壹’ 关于java多线程如何绑定CPU

  • CPU在某一个时间点上确实只能执行一个线程,但是多线程不是由于多核或者双核才叫多线程。

  • 是由于,很多个线程在并行执行的时候,CPU根据一定的线程调度算法,频繁的进行线程切换,当正在执行的一个线程需要进行IO操作或者需要访问内存的时候,CPU完全可以放弃该线程,转而调度线程就绪队列上的其他线程,被放弃的线程则进入阻塞状态,IO操作或者访问内存操作结束之后,该线程可以进入线程就绪队列上。

  • 人们通常意义上的多线程指的是,由于CPU根据一定的线程调度算法来切换线程,所以在一个时间段上,可以看做很多线程在并发执行。

  • 其实还是在某一个时间点上只有一个线程在运行罢了。

‘贰’ Java多线程小程序错误,求解答

是2L说的和你现在出现的这个错误无关,我想1个时间片对于这个程序来说,是绝对可以把几行代码执行完的,从CPU指令的时间上也可以推出来。从上面可以非常明显的看出来,关键是第一次输出的问题,其实你的多线程代码问题很多,但是在你这个程序里表现不出来。

为了解释一些东西,先解释一些概念。其实你说这个问题如果往深处说就复杂了,只能简单的去说

时间片:CPU对线程的执行,是通过分配时间片来实现的,即每个线程每次运行都有一个时间限制,不能超过这个时间,这个时间的最大程度就是时间片(如果不考虑抢占的问题,时间片是一定的,即每个线程每次都运行一个完整的时间片的时间)

线程调度算法:CPU对线程的调度,是有一个算法来决定调度系统所有线程的先后顺序(这里为了方便解释,我全部认为是核心线程,而不存在用户线程,用户线程是通过进程间接调度的,即CPU并不知道有用户线程存在,而核心线程是CPU直接知道的并且直接调度的)。那算法是怎么样的,历史上有无数种线程调度算法,作为一个程序员,你只能认为是不可知的,即你要保证无论哪个线程先执行,程序都是一致的。这个算法由操作系统决定。
取你的代码的关键部分

SLEEP函数:这个函数到底做了什么,两件事,1放弃时间片立即让操作系统进行下一次调度,2定时让自己变得可以重新调度(你设定的时间内此线程是不可调度的)
Tsleep1 T1= new Tsleep1();
Tsleep2 T2= new Tsleep2();

T1.start();
T2.start();
你的程序里绝对T1会先执行完一次循环,这个基本是肯定的,因为要执行的操作肯定用不了半个时间片就足够了,所以时间片造成的放弃调度的问题基本不太可能(针对你的代码)。所以第一个输出一定是输出0,也确实这样。

try{
sleep(1000);
}

好了,解释输出。

前者关键是下面的
0
This is i=0
This is i=1
1

0
This is i=0
1
This is i=1
在你T1第一次输出0后,调用SLEEP放弃了时间片,这个时候T2运行输出了This is i=0,这个过程不太可能有同步的问题,因为相对1S来说,时间片实在是太短了,而且你执行操作极少,基本保证了是原子的。
关键是第3行开始,现在经过前面的调度,T2进入睡眠了,为什么现在反而T2先比T1先运行,明明是T2在睡眠嘛?原因是,你的两个线程都是用户级线程(一般核心级线程要显示的指明,因为开销过大),这种情况下,CPU是先调度进程,然后进程才决定让谁先运行。在T2睡眠的时候,CPU调度其他进程,等到再次轮到你的进程的时候,T1和T2都已经“醒”了,这个时候操作系统要根据自己的算法去决定,这个算法并不是先进先出的,即使你T1先醒,T2后醒,但是两者没有优先级的区别,操作系统视为平等,可以自由选择调度哪一个。 并且,即使两者都是核心级线程,也可能另外其他程序长期占用了CPU而使得下一次调度的时候对两者的调度发生细微的顺序差异。所以即使你T1先START,T2后START,仍然无法保证以后T1先于T2,需要进行同步。同步使用信号量的方法就足够了。

两个线程共享全局变量i,初始化为0,自己同步就行了,反而效率更高些。别说面相对象就不使用全局变量,同步那绝对在多个线程之间避免不了共享。

伪代码,只是表达意思,同时保证了每次操作是原子的也保证了顺序,虽然2L保证了每次操作的原子性,但是没能够保证顺序,当然,可能是看不出来效果的。
T1执行时首先
while{

if(i==0)
{
i++;
执行你想的操作
sleep(0);//放弃时间片就好了,没必要等那么久
}
else
{
sleep(0);//说明T1完后又再次先于T2被调度了,立即放弃时间片
}
}
对于T2

while{
if(i==1)
{
i--;
执行你想的操作
sleep(0)
}
else
{
sleep(0);//立即放弃时间片
}
}

‘叁’ JAVA抢占式线程调度的问题

1线程的调度并不是由java决定的,而是os,os可以保证所有线程都有机会得到执行。即时某个线程正在忙。也会被休眠。具体的你要看os相关的线程调度这一块,这叫抢占式任务调度。

2即使线程t的优先级高,在调用start时,也不会保证线程已经真实的启动。os只是把他放到了线程队列中去排队。而当前线程继续执行。

‘肆’ java线程调度的策略是什么

时间片轮转 加 优先级
你可以这样试
在一个线程里死循环输出"1",
第二个输出"2"
......
然后设置他们的优先级,并且run.你可以看下屏幕上的输出结果
屏幕跳得很快,但你应该能看清楚优先级最高的那个数字...

‘伍’ Java线程的知识要点

一、进程的概念

进程表示资源分配的基本单位,又是调度运行的基本单位。例如,用户运行自己的程序,系统就创建一个进程,并给它分配资源,包括内存空间、磁盘空间、I/O设备等。然后,把该进程放入就绪队列。进程调度程序选中它,为它分配CPU以及其他有关的资源,该进程才真正运行。所以,云南电脑培训http://www.kmbdqn.cn/发现进程是系统中的并发执行的单位。

二、线程的概念

线程:(英语:thread)是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。

三、引用线程的优势

(1)易于调度。

(2)提高并发性。通过线程可方便有效地实现并发性。进程可创建多个线程来执行同一程序的不同部分或相同部分。

(3)开销少。创建线程比创建进程要快,所需开销很少。

(4)利于充分发挥多处理器的功能。通过创建多线程进程(即一个进程可具有两个或更多个线程),每个线程在一个处理器上运行,从而实现应用程序的并发性,使每个处理器都得到充分运行。

四、进程与线程的关系

(1)一个线程只能属于一个进程,而一个进程可以有多个线程,但至少有一个线程。

(2)资源分配给进程,同一进程的所有线程共享该进程的所有资源。

(3)处理机分给线程,即真正在处理机上运行的是线程。

(4)线程在执行过程中,要协作同步。不同进程的线程间要利用消息通信的办法实现同步。

简单来说:

1、一个程序至少有一个进程,一个进程至少有一个线程。

2、进程在执行过程中拥有独立的资源,而多个线程共享进程中的资源。


‘陆’ 线程的调度分为几种模型,在java中是使用哪种调度模型

Java程序属于抢占式调度,哪个线程的优先级高,哪个线程抢到的CPU时间片的概率就高;如果两个线程同一个优先级,则CPU随机选择一个执行。

‘柒’ JAVA中实现多线程负载平衡算法

将请求放到一个全局的队列中去。每个子线程不断地从队列中取出请求并处理请求,如果队列中没有请求则子线程等待。

‘捌’ java的多线程是OS调度还是JVM调度的呢

现在java线程和操作系统线程之间的对应关系有三种:
多对一、一对一、多对多

多对一就是所说的“Green thread”,一个java应用程序
被当作一个任务被操作系统调度,而这个java应用程序里
的多个线程则由虚拟机调度执行。也可以说由虚拟机选出
一个多线程java程序里的一个线程作为活动线程,这个线
程再作为操作系统的一个任务被操作系统调度。

一对一就是一个java线程对应一个操作系统线程了,即同
一个多线程java程序里的所有线程都由操作系统统一调度。

多对多还不是很明白。。。

‘玖’ java多线程详细理解

  • 多线程:指的是这个程序(一个进程)运行时产生了不止一个线程

  • 并行与并发:

  • 并行:多个cpu实例或者多台机器同时执行一段处理逻辑,是真正的同时。

  • 并发:通过cpu调度算法,让用户看上去同时执行,实际上从cpu操作层面不是真正的同时。并发往往在场景中有公用的资源,那么针对这个公用的资源往往产生瓶颈,我们会用TPS或者QPS来反应这个系统的处理能力。

  • 线程安全:经常用来描绘一段代码。指在并发的情况之下,该代码经过多线程使用,线程的调度顺序不影响任何结果。这个时候使用多线程,我们只需要关注系统的内存,cpu是不是够用即可。反过来,线程不安全就意味着线程的调度顺序会影响最终结果,如不加事务的转账代码:

  • 同步:Java中的同步指的是通过人为的控制和调度,保证共享资源的多线程访问成为线程安全,来保证结果的准确。如上面的代码简单加入@synchronized关键字。在保证结果准确的同时,提高性能,才是优秀的程序。线程安全的优先级高于性能。

热点内容
安卓系统如何调成维修模式 发布:2024-05-13 17:14:31 浏览:232
恒易贷服务密码多少 发布:2024-05-13 17:14:29 浏览:37
图书馆数据库下载 发布:2024-05-13 17:00:54 浏览:897
芒果tv无法缓存 发布:2024-05-13 17:00:41 浏览:675
wifi密码输错怎么重新输入 发布:2024-05-13 16:58:37 浏览:492
有什么网页存储网盘 发布:2024-05-13 16:34:30 浏览:995
pgp加密软件下载 发布:2024-05-13 16:29:25 浏览:746
马路上传染 发布:2024-05-13 16:09:41 浏览:366
安卓44和安卓100哪个高 发布:2024-05-13 16:09:36 浏览:440
ftp有丢包重传嘛 发布:2024-05-13 16:01:27 浏览:132