Java~多线程~利用Java创建线程的几种方式、进程与线程区别(重点)

进程、线程的概念

->进程

我们计算机中的很多操作系统都是支持“多任务”的。每一个任务或者说每一个正在执行的块程序就是一个进程。进程是操作系统分配资源的基本单位

->线程

线程又叫“轻量型进程”“微进程”。如果把进程看作一个重骑兵,那么线程就可以看作一个轻骑兵。线程存在的原因,就是因为计算机系统在创建进程,销毁进程或者调度进程等操作中的开销太大,计算机有点吃不消~
线程包含在进程之中,是进程的实际运行单位。每个进程中至少存在一个线程,即主线程。线程可以看作一个“执行流”,当有任务来临时,线程可以并发完成执行。
同一个进程中的多个线程共享该进程的全部资源,像虚拟地址空间,信号处理和文件描述符等等。而同一个进程中的多个线程又有自己的调用栈、寄存器环境和线程本地储存等。
线程是操作系统调度和执行的基本单位。

->Java线程与操作系统中线程的关系

操作系统内核中实现了线程这样的机制,线程本就是操作系统中的概念,内核的线程提供了一些API供用户使用。
而Java中的Thread类(线程)是对操作系统提供的线程API进一步的抽象与封装使用。

->用Java创建线程的几种方式

->继承Thread类,重写run方法
package 线程;


class MyThread extends Thread{
    @Override  //run就是线程中的任务
    public void run() {
        System.out.println("创建线程的第一种方式");
    }
}
public class ThreadDemo1{
    public static void main(String[] args) {
        Thread t=new MyThread();
        //start方法会在操作系统中真的创建出一个线程来(在内核中创建新的pcb,加入到双向链表中)
        t.start();
    }
}
->继承Thread类,重写run方法,使用匿名内部类
package 线程;
//



public class TestDemo4{
    public static void main(String[] args) {

        Thread t=new Thread(){
            @Override
            public void run() {
            //依然循环打印,每次间隔1秒
                while(true){
                    System.out.println("第二种创建线程的方式");
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        };
        //运行线程
        t.start();
    }
}
->实现Runnable接口,重写run方法
package 线程;



class MyRunnable implements Runnable{
    @Override
    public void run() {
    //方法run又叫做线程体,里面存放线程具体要执行的任务
    //这里我们让该线程循环打印 每次打印间隔1秒
        while(true){
            System.out.println("第3种创建线程的方式");
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}
public class ThreadDemo3{
    public static void main(String[] args){
    //此处把Runnable实例作为参数传给Thread
        Thread t=new Thread(new MyRunnable());
        
        t.start();//执行线程
    }
}
->实现Runnable接口,重写run方法,使用匿名内部类
package 线程;

public class TestDemo5{
    public static void main(String[] args) {
        Thread t=new Thread(new Runnable() {
        //注意:是将Runnable一个整体放入了Thread后面的括号中
            @Override
            public void run() {
                while(true){
                    System.out.println("第4种创建线程的方式");
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        });
        t.start();
    }
}
->使用lambda表达式
package 线程;






public class TestDemo6{
    public static void main(String[] args) {
        Thread t=new Thread(()->{
            while(true){
                System.out.println("第5种创建线程的方式");
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });
        t.start();
    }
}

进程、线程的区别(面试重点)

  • 本质:进程是系统分配资源的基本单位,线程是系统调度的基本单位。
  • 包含性:进程和线程之间是包含的关系。每个进程中至少含有一个线程,即主线程。
  • 资源共享方面:同一个进程中的若干线程共享该进程中的所有资源。而进程与进程之间不共享资源。
  • 开销:线程的调度比进程快很多,线程的创建和销毁所带来的开销也比较小。
  • 健壮性:进程的健壮性较强,在多进程环境中,一个进程崩掉,其他进程不受影响,而在一个进程的多个线程中,一个线程崩了,其他线程也会全部崩溃。
  • 执行:线程与进程都可并发执行。但进程在执行时有一套全面的流程,有程序的入口、出口、中间过程等,而线程没有,线程只能依附与进程的应用程序之中。
  • 14
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值