java-线程

操作系统

一、硬件

硬件组成:冯诺伊曼结构/普林斯顿体系结构

注意事项:CPU和输入设备与输出设备之间不能直接交互,需要靠存储。
内存和硬盘的区别:
1.内存的读写速度远远大于磁盘,内存的读写速度是纳秒级别的,硬盘的读写速度是微秒级别的;
2.运行的程序都在内存中运行,内存的价格远大于硬盘;
3.内存中的数据不能永久的存储,当电脑重启之后数据就没了,不能持久化,而硬盘是可以持久化的;

二、软件 OS——操作系统

操作系统:程序的集合。
组成:内核(进程管理、内存管理、文件管理、驱动管理)、其他程序(函数库、shell程序等)。
OS定位:一款纯搞管理的软件。
作用:
与硬件交互,管理所有的软硬件资源(对内且对下);
为用户程序(应用程序)提供一个良好的执行环境(对外且对上);

三、进程

进程是操作系统分配资源的最小单位。
内核部分产生一个由双向链表组成的PCB。
一个执行任务就是一个进程。(可执行任务不等于进程)
PID是进程的身份ID,但重启进程之后PID就变了。
进程的本质:将.exe文件转换为PCB(进程管理模块)
PCB组成:PID(主键ID、身份标识)、状态信息(新建、就绪、运行、阻塞、终止)、优先级、记账信息(记录程序运行次数,防止CPU资源分配不均)、一组指针(需要使用的资源)、上下文(当分配到CPU资源时执行,没有CPU资源时,暂时保存当前状态,等待下一次执行(时间片),这个过程就叫一个上下文)
时间片:任务执行的一小段时间。
程序运行:
并行运行:(宏观和微观)所有的应用一起运行。
并发运行:只有一个资源,轮流执行(宏观上是一起执行,微观上是轮流执行)。
操作系统对权限的分级——用户态与内核态
内核态:操作系统内核作为直接控制硬件设备的底层软件,权限最高;
用户态:用户自己的,用户程序权限最低;
进程的状态:
创建-就绪-运行-终止或阻塞

四、线程

最早的并发编程是多线程并发编程。多个进程不能共享资源。
线程:是系统调度资源的最小单位,它被包含在进程之中,是进程的实际运作单位。也就是说,一个进程中最少包含一个线程,线程必须依附进程才能存活,进程就好比一个工厂,而线程就是一个人一个流水线;进程是系统分配资源的最小单位,线程是系统调度的最小单位。
多个进程不能共享资源,多个线程可以共享资源。
单进程多线程使得效率更高,资源占用更少。
线程可以共享资源:打开的文件、内存(对象)。
线程不可共享的资源:
上下文、记账信息、状态、线程栈信息、优先级。
注意事项:
线程的数量不是越多越好,当线程数量达到某个值是最好的,如果有太多线程,就会出现线程之间的争抢和CPU的过度调度问题,而CPU调度需要消耗系统资源的,所以线程不是越多越好。
多少线程最好?
要看具体的应用场景,例如密集计算的CPU任务(线程的数量等于CPU的数量是最好的)、IO型(文件读写)任务(理论上是线程数量越多越好)。
进程-》线程(轻量级进程)-》协程(轻量级线程)
线程创建的方式(3类):
1.继承Thread类(2种);

public class ThreadDemo2 {
    public static void main(String[] args) {
        Thread t1=new Thread(){
            @Override
            public void run() {
                System.out.println("线程名称"+Thread.currentThread().getName());
            }
        };
        t1.start();
        System.out.println(Thread.currentThread().getName());
    }
}
public class ThreadDemo extends Thread{
@Override
    public void run(){
    //线程执行任务
    System.out.println("线程名称"+Thread.currentThread().getName());
}

    public static void main(String[] args) {
        Thread t1=new ThreadDemo();
        t1.start();
        System.out.println("主线程方法"+Thread.currentThread().getName());
    }
}

2.实现Runnable接口(3种);

public class MyRunnable implements Runnable{
    @Override
    public void run() {
        System.out.println(Thread.currentThread().getName());
    }
    public static void main(String[] args) {
        //新建Runnable类
        MyRunnable runnable=new MyRunnable();
        //新建Thread
        Thread thread=new Thread(runnable);
        thread.start();
        System.out.println(Thread.currentThread().getName());
    }
}
public class MyRunable2 {
    public static void main(String[] args) {
        Thread thread=new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println(Thread.currentThread().getName());
            }
        });
        thread.start();
        System.out.println(Thread.currentThread().getName());
    }
}
public class MyRunnable3 {
    public static void main(String[] args) {
        Thread thread=new Thread(()->{
            System.out.println(Thread.currentThread().getName());
        });
        thread.start();
        System.out.println(Thread.currentThread().getName());
    }
}

3.实现Callable接口(1种);

public class MyCallable implements Callable<Integer> {

    @Override
    public Integer call() throws Exception {
        int num=new Random().nextInt(10);
        System.out.println(Thread.currentThread().getName());
        return num;
    }

    public static void main(String[] args) throws ExecutionException, InterruptedException {
        //创建一个Callable
        MyCallable myCallable=new MyCallable();
        //创建一个容器
        FutureTask<Integer>futureTask=new FutureTask<>(myCallable);
        Thread thread=new Thread(futureTask);
        thread.start();
        int result=futureTask.get();
        System.out.println(Thread.currentThread().getName()+" "+result);
    }
}
线程休眠(3种)

线程分组:ThreadGroup
可以将一类线程归为一组,并进行信息的打印,以及行为的限制。
线程优先级:新创建的线程,默认优先级为5,最小优先级为1,最大优先级为10。值越大执行权重越高。优先级越高,执行的优先级也越高,执行权也就越大,但CPU的调度是很复杂的,不会严格按照优先级的排序去执行,但是大体上是按照权重去执行。

线程分类:

1.后台线程:(守护线程)用来服务用户线程,用户线程就是上帝。
2.用户线程
进程退出:没有用户线程,进程就会结束,不论是否还有后台线程。

守护线程的使用场景:

1.Java垃圾回收器。
2.健康检查。
守护线程的注意事项:
1.设置守护线程必须放在线程开始之前,如果设置守护线程在开启线程之后,那么就会报错,并且设置不生效;
2.如果在守护线程里创建的线程,默认是守护线程;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值