大家好,又见面了,我是你们的朋友全栈君。
知识点:
1,进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是分配资源的基本单位,线程是进程的一个实体,是CPU调度和分派的基本单位
2,线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。
2,一个进程包含一个或多个线程;
3,同一个进程中的多个线程之间可以并发执行.
4,一个程序至少有一个进程,一个进程至少有一个线程.
5,线程是CPU分配时间的单位,通常一个CPU内核处理器可以处理一个线程,但是现代cpu通过超线程技术可以同时处理两个线程
6,核心数即cpu个数
7,同一时刻,单个cpu线程数只能处理一个java线程,或者其他任意线程
8,java所有线程都在JVM进程中
9,cpu调度的是进程中的线程
10,当计算机运行的进程中所有线程数大于cpu线程数的时候,操作系统会采用时间片机制:为每个线程分配时间额度,如果当前线程的时间额度用完了,就会被强制停止(不考虑优先级等机制),切换其他线程执行;这样会给人一个计算机能够同时处理很多线程的错觉。
11,cup核心数多当然就能够同时处理多个线程。不过机器就要贵很多了
12,windows NT是抢占先式多任务操作系统,这意味着操作系统不必等待一个线程,它可主动将处理器让给其它线程。在这种方式下,当一个线程已运行了配额的时间后,或出现抢先情况时,操作系统将中断该线程。如图所示:
线程转让CPU处理时间是被迫的。占先式多任务可以防止线程独占CPU,允许其它线程公平地分享CPU执行时间
13,抢占式多任务操作系统的好处是:
1,对比在16位Windows环境下,如果一个程序进入无限循环,则其它应用程序可能永远没有机会执行;而在Windows NT环境下这种情况不会发生,相反,许多线程的执行部分都采用了循环扫描的结构。这也是实现了多线程的基础。
2,线程要做很多的的操作,读写磁盘、数据逻辑处理、出于业务需求必要的休眠等等操作时间都能节省下来
14,java设置线程池大小,这里提供三个考量点:
1,一般情况程序线程数等于cpu线程数的两到三倍就能很好的利用cpu了
2,一个公式:线程池设定最佳线程数目 = ((线程池设定的线程等待时间+线程CPU时间)/线程CPU时间 )* CPU数目
这个公式的线程cpu时间是预估的程序单个线程在cpu上运行的时间(通常使用loadrunner测试大量运行次数求出平均值)
3,上面两个方案都是参考而已,给出个大概范围,最后最佳的线程池设定大小还是要根据实际情况,多次实验。
15,多线程时间片机制的代码体现实验案例:
package client.cfca;
/**
* 下面有四个线程,公用一个方法体,做三次循环,没次每个线程停顿5s
* @author liuxin
* @date 2018年8月1日
*/
public class ad {
public static void main(String[] args) {
Dog t1=new Dog();
Dog t2=new Dog();
Dog t3=new Dog();
Dog t4=new Dog();
t1.setName("t1");
t2.setName("t2");
t3.setName("t3");
t4.setName("t4");
t1.start();
t2.start();
t3.start();
t4.start();
}
}
class Dog extends Thread{
private int count=3;
public void run(){
try {
synchronized (this) {
for(int i=0;i<3;i++){
System.out.println(Thread.currentThread().getName()+" count="+count--);
sleep(5000);
}
System.out.println(Thread.currentThread().getName());
}
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
结果:
t1 count=3
t3 count=3
t4 count=3
t2 count=3
t1 count=2
t3 count=2
t4 count=2
t2 count=2
t1 count=1
t3 count=1
t4 count=1
t2 count=1
t1
t3
t4
t2
从结果中可以看出(读者可亲自试验),会发现每次都是差不多5s后四个线程同时打印,三次循环打印差不多都是。可粗略看做是时间分片机制和cpu多核线程可同时处理机制的作用结果。
16,从java角度理解进程与线程:启动一个main方法就启动了一个jvm虚拟机进程,如果我在main程序中又new Thread()了十个线程,那么这个进程中就有一个主线程(main)和十个附加线程。如果我再运行了一个main程序,那么机器中就有两个JVM进程。
17,进程和线程的重要区别:从逻辑角度来看,多线程的意义在于一个应用程序中,有多个执行部分可以同时执行。但操作系统并没有将多个线程看做多个独立的应用,来实现进程的调度和管理以及资源分配
18,进程多还是线程多的选择:线程执行开销小,但不利于资源的管理和保护,如果频繁启动关闭则最好使用线程;而进程正相反。同时,线程适合于在SMP机器上运行,而进程则可以跨机器迁移。
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/106204.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...